提供Java库,但隐藏了一些类
我正在开发一个Java ME中的应用程序,我希望将其作为库提供。 有没有办法隐藏我不希望每个人都使用的类,但是为了让库工作还是必不可少的?
更新:我知道我可以省略公共说明符,但是如何在开发的同时构建库本身而不创建不同的包? 我喜欢将不同的包视为不同的文件夹,这使我能够以良好的方式构建代码。 但是,在某些情况下,我可能需要访问其他包中的类,因此这非常棘手。 包真正代表什么? 一个想法可能是创建“接口”,但这些必须被声明为public,这意味着外国人也可以实现仅用于库内某些进程的接口,对吗?
要设置库API,您需要保护您不想暴露的任何内容。 这样做只是省略了访问修饰符:
class fooBar { // do stuff here }
这将把类访问设置为’default’,允许从同一个包以及子类fooBar
任何类中进行访问。
在您的类中,您还需要通过将方法和成员标记为private
, protected
或省略修饰符来锁定对方法和成员的任何访问,以便它们根据需要为“默认”。
-
private
将仅允许从包含类访问; - ‘default’(无修饰符)允许在包含的类中包含包; 和
-
protected
将允许从同一个类,包和任何子类中进行访问。
对于你暴露的任何事物( public
),如果它不被设计为被覆盖,那么将它标记为final
也是一种好习惯。
基本上,尽可能多地锁定所有内容。 较小的API更易于使用且更难破解。 如果您发现将来需要展示某些内容,请在将来进行。 扩展API而不是弃用部分API要容易得多。
您可以使类package protected
,只有同一包中的其他类才能看到。 如果这不可行,那么您可以使用ProGuard来修改类并隐藏它们的实现。
就在这里。
只是不要public
这些类。 换句话说,省略public
关键字,如下所示:
class Internal { // rather than "public class Internal" ... }
默认情况下,只能在定义它们的包中访问类。
让我们考虑一个例子:
如果你有一个要隐藏的类A和一个使用类Afunction的类B,那么你可以这样做:
class B{ //Attribute and Methods //Inner class A class A{ //Methods and Attributes. } }
执行此操作后,您可以在类B的方法中创建类A的Object,从而使用它。 虽然该类将被隐藏在其他类中,但它仍然可以使用。
如果可以使用Java 9,请使用Jigsaw模块 。 如果没有,将每个类放在同一个包上,对隐藏类进行包级访问,并使用Maven模块来组织它们。
我在我的名为coronata的项目中完成了这一点,这是一个Wii远程Java库。 几乎所有类都在com.github.awvalenti.bauhinia.coronata
包中,但是在不同的模块上(在IDE上显示为项目)。
可见课程是公开的。 他们在模块中:
-
coronata-api
-
coronata-builder
-
coronata-demos
-
coronata-lib
隐藏类具有包级访问权限。 他们在模块中:
-
coronata-common
-
coronata-implementation-bluecove
-
coronata-implementation-wiiusej
您需要使您不希望暴露的类受到保护。 这将使它们不能从客户端代码中使用。 阅读官方文档中的更多内容