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