提供Java库,但隐藏一些类

2022-09-04 23:22:50

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

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


答案 1

要设置库 API,您需要保护您不希望公开的任何内容。执行此操作,只需省略访问修饰符:

class fooBar {
    // do stuff here    
}

这会将类访问设置为“默认”,这允许从同一包中以及从子类中的任何类进行访问。fooBar

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

  • private将仅允许从包含类访问;
  • “default”(无修饰符)允许从包含类和包含包内部;和
  • protected将允许从同一类,包和任何子类中访问。

对于您公开的任何内容(),最好将其标记为好像它不是为被覆盖而设计的。publicfinal

基本上,尽可能多地锁定所有内容。较小的API更易于使用且更难破解。如果你发现将来需要暴露的东西,将来就去做。扩展API比弃用它的一部分要容易得多。


答案 2

如果 Java 9 是可能的,请使用 Jigsaw 模块。如果没有,请将每个类放在同一个包上,对隐藏类具有包级访问权限,并使用 Maven 模块来组织它们。

我已经在我的名为coronata的项目中做到了这一点,这是一个Wii Remote java库。几乎所有的类都在包中,但是在不同的模块上(在IDE上显示为项目)。com.github.awvalenti.bauhinia.coronata

可见类是公共的。它们位于模块中:

  • coronata-api
  • coronata-builder
  • coronata-demos
  • coronata-lib

隐藏类具有包级访问。它们位于模块中:

  • coronata-common
  • coronata-implementation-bluecove
  • coronata-implementation-wiiusej

推荐