我的项目目前正在关注包结构。
这里我添加了一个包名utils
,并在其中定义了与该模块相关的所有实用程序类。这些已被其他软件包(即impl
,internal
)使用,因此我在util
软件包public
中创建了类和方法。
因为它是公共的,不仅是这个模块中的类,其他模块中的类也可以访问它,当我使用我的IDE进行编码时,它们被显示为编码建议。
我通过一些研究论文描述了这会如何降低API的可用性,并为参与开发的开发人员 [ref1,ref2]提供糟糕的体验。
我知道java不允许我在util
和impl
及内部包中访问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'中是否正确?或者我应该将所有彼此通信的类放在同一个包中吗?
答案 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 。