提供Java库,但隐藏了一些类

我正在开发一个Java ME中的应用程序,我希望将其作为库提供。 有没有办法隐藏我不希望每个人都使用的类,但是为了让库工作还是必不可少的?

更新:我知道我可以省略公共说明符,但是如何在开发的同时构建库本身而不创建不同的包? 我喜欢将不同的包视为不同的文件夹,这使我能够以良好的方式构建代码。 但是,在某些情况下,我可能需要访问其他包中的类,因此这非常棘手。 包真正代表什么? 一个想法可能是创建“接口”,但这些必须被声明为public,这意味着外国人也可以实现仅用于库内某些进程的接口,对吗?

要设置库API,您需要保护您不想暴露的任何内容。 这样做只是省略了访问修饰符:

class fooBar { // do stuff here } 

这将把类访问设置为’default’,允许从同一个包以及子类fooBar任何类中进行访问。

在您的类中,您还需要通过将方法和成员标记为privateprotected或省略修饰符来锁定对方法和成员的任何访问,以便它们根据需要为“默认”。

  • 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

您需要使您不希望暴露的类受到保护。 这将使它们不能从客户端代码中使用。 阅读官方文档中的更多内容