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

时间:2011-07-10 18:10:41

标签: java java-me

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

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

6 个答案:

答案 0 :(得分:4)

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

class fooBar {
    // do stuff here    
}

这会将类访问权限设置为“default”,允许从中进行访问 在同一个包中以及从子类的任何类中 fooBar

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

  • private仅允许来自包含类的访问;
  • 'default'(无修饰符)允许在包含的类中包含包;和
  • 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

中的更多内容