Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中类可见性的控制_Java_Api_Usability_Access Modifiers - Fatal编程技术网

Java中类可见性的控制

Java中类可见性的控制,java,api,usability,access-modifiers,Java,Api,Usability,Access Modifiers,我的项目目前有以下包结构 在这里,我添加了一个包名utils,并在其中定义了与此模块相关的所有实用程序类。其他软件包(即impl,internal)使用了这些方法,因此我在utilpackage中创建了类和方法 因为它是公共的,不仅这个模块中的类,其他模块中的类也可以访问它,当我使用IDE编码时,它们显示为编码建议 我阅读了一些研究论文,这些论文描述了这会如何降低API的可用性,并给参与开发的开发人员带来不好的体验 我知道java不允许我使util中的类可供impl和内部包访问,而不允许其他人

我的项目目前有以下包结构

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

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

我阅读了一些研究论文,这些论文描述了这会如何降低API的可用性,并给参与开发的开发人员带来不好的体验

我知道java不允许我使
util
中的类可供
impl
和内部包访问,而不允许其他人访问


将我的实用程序类放在包“util”中是否正确?或者我应该将所有相互通信的类放在同一个包中吗?

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

在OOP的完美世界中,不会有任何util类,但是如果util类不属于特定的类,则创建它们被认为是一种良好的实践

此处列出了访问修饰符的选项:


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

你是对的,标记为public的东西在任何其他软件包中都是可用的。与其他语言相比,Java不提供除此之外的任何控制

一个简单的解决方法:让一个特殊包包含那些公共东西,这些东西应该可供您的外部用户使用,这可能会有所帮助

意思是:创建类似于
com.whatever.product.api的东西,并告诉用户他们可以从那里使用任何东西,但不能使用其他东西

换句话说:你把所有你需要公开的东西都公开;但是你在一个特殊的地方收集这些东西,你允许别人使用


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

在OOP设计方面,您不应该有实用程序类:)我使用了一个坏例子吗?o、 你用的是哪个IDE?在Eclipse中,显示为代码建议的第一个类是同一个包中的类或导入的类(包括
java.lang.*
)。其他的公共课也会出现,但会在这些课之后出现。我用的是idea。因为这些类根本不打算在其他包中使用,所以我试图使它们不被其他包访问。由于我使用OSGI加载模块,如果有人在IDE建议的其他类中意外使用它,这将导致运行时错误。这可能有些过分,但随着应用程序的增长,使用多个项目管理代码库会更容易。例如,应用程序的每个功能层都在自己的项目中。这可以在它自己的项目中包含util类,其中util.jar只是成为其他需要它的项目的依赖项。这有助于避免util类成为垃圾抽屉,因为开发人员必须有意识地转到另一个项目来添加新的util类/方法。根据构建工具的不同,这还将强制util类为泛型类,以避免循环依赖关系。因此,我可以假设我使用的包结构是常见的,并且没有任何问题吗?除了包名称之外,您的文章没有包含足够的详细信息来确定您的项目结构。将项目分为多个包是一种很好的做法。你提到了API?您正在尝试创建API吗?请记住,如果有人想使用您的utils类,那么他们必须导入该包,否则对他们来说它将不可见。因此,只要它们不导入您的util类,它就会自行处理。这是项目的一部分,我们可以将这个jar放入m2中,并在其他代码中访问它。org.wso2.carbon.identity.workflow.impl包中的类就是API。不同的项目可以通过它们访问功能。其他包中的其他类(例如:dao)不应该被外部类访问。我快速查看了一下。看起来您的util类是“真正的”util类,它们似乎与其余代码无关。祝你的项目好运!