用Java控制类可见性

时间:2017-03-30 13:26:40

标签: java api usability access-modifiers

我的项目目前正在关注包结构。

enter image description here

这里我添加了一个包名utils,并在其中定义了与该模块相关的所有实用程序类。这些已被其他软件包(即implinternal)使用,因此我在util软件包public中创建了类和方法。

因为它是公共的,不仅是这个模块中的类,其他模块中的类也可以访问它,当我使用我的IDE进行编码时,它们被显示为编码建议。

我通过一些研究论文描述了这会如何降低API的可用性,并为参与开发的开发人员 [ref1ref2]提供糟糕的体验。

我知道java不允许我在utilimpl及内部包中访问ext { supportlib_version = '25.2.0' ... } ... subprojects { project.configurations.all { resolutionStrategy.eachDependency { details -> if (details.requested.group == 'com.android.support' && !details.requested.name.contains('multidex') ) { details.useVersion "$supportlib_version" } } } } ... 内的类,而不允许其他人访问。

将我的实用程序类放到包'util'中是否正确?或者我应该将所有彼此通信的类放在同一个包中吗?

2 个答案:

答案 0 :(得分:1)

Util类很好。 Util类是在项目中多个位置使用但实际上不属于特定类的功能。

在一个完美的OOP世界中,没有任何util类,但是如果它们不属于特定的类,那么创建util类是个很好的做法。

此处列出了访问修饰符的选项: https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

有一种方法可以实现你想要的东西,然而它被认为是一种非常糟糕的做法。您可以将util类的访问修饰符更改为protected。这将使您的util类可以从子类和包中访问。因此,如果一个类需要访问其中一个util类,那么它必须扩展这个util类,从而成为一个子类。 我无法强调它,这是一种非常糟糕的做法。

答案 1 :(得分:1)

您是对的,标有公开的内容可在任何其他包中使用。与其他语言相比,Java不提供任何控制。

一个简单的解决方法:拥有一个特殊包,其中包含外部用户可以使用的公开内容可能会有所帮助。

含义:创建类似com.whatever.product.api的东西 - 并指示您的用户可以使用其中的所有内容 - 但没有别的。

换句话说:您将 public 所需的所有内容 public ;但是你把这些东西收集在一个允许他人使用的特殊地方。

值得一提的是,Java9将引入 modules 的概念,这些允许您定义哪些软件包 public 模块的用户。从这个意义上讲,java 9模块允许您区分“内部”和“外部” public