Java 对我来说,包含一个“是一种不好的做法吗?”;“内部”;我的图书馆里有什么包?

Java 对我来说,包含一个“是一种不好的做法吗?”;“内部”;我的图书馆里有什么包?,java,shared-libraries,Java,Shared Libraries,我正在设计一个库,虽然我知道我应该只公开我希望客户端访问的类,但是我很难坚持这个最佳实践。据我所知,这是最佳实践。我决定将一个名为internal的包放在我库中的一个包中,以保存我打算作为包私有的类,但可能最终成为public Java中包的工作方式似乎有缺陷,因为您无法将类设置为“父包私有”,所以在遇到此类问题时,是否真的存在“错误做法”?等待Java 9,事情就会解决。新的 模块结构将允许对公共数据进行限制 在模块之外的任何位置初始化 但即使在那之前,请注意,访问权并不是真正可以强制执行的。

我正在设计一个库,虽然我知道我应该只公开我希望客户端访问的类,但是我很难坚持这个最佳实践。据我所知,这是最佳实践。我决定将一个名为
internal
的包放在我库中的一个包中,以保存我打算作为包私有的类,但可能最终成为
public


Java中包的工作方式似乎有缺陷,因为您无法将类设置为“父包私有”,所以在遇到此类问题时,是否真的存在“错误做法”?

等待Java 9,事情就会解决。新的 模块结构将允许对公共数据进行限制 在模块之外的任何位置初始化


但即使在那之前,请注意,访问权并不是真正可以强制执行的。通过正确使用反射,您可以访问任何东西,甚至是私有的(不确定,但我认为Java9的模块不会通过反射提供访问)

访问修饰符只是对用户的一个提示:“不要依赖我,我可能会改变”。如果访问修饰符是不可能的,我会认为它完全可以用另一种方式给出注释。即使是JDK也有完全可访问的
sun
com.sun
包,但每个人都知道不应该在这些包上构建代码


在一些流行的API中,我发现包名
internal
非常常见,因此您可以使用它。

“只要正确使用反射,您就可以访问任何内容”——前提是您没有安装SecurityManager。不受信任的代码无法访问“任何内容”。您自己编写或决定运行的受信任代码当然可以做任何事情。@ErwinBolwidt我应该如何让潜在客户知道不要使用这些类?我应该以某种方式对它们进行标记,还是让它们保持在
内部的状态@不赞成?我想如果我的方法都不是静态的,那么其中一个就不能真正使用它,所以这可能不是必需的