为“无修饰符”方法提供其他包可访问性

时间:2010-10-11 06:17:45

标签: java

有一个名为

的类
public Class Foo{

   public something(){
   ...}

   Foo(){
   ...}
}

现在因为类是公共的,所以任何人都可以访问它,但它的构造函数只能用于本地包,但有没有办法将构造函数提供给任何其他包

问题是它已经是我正在研究的相当大的代码,并且不希望公众可以使用构造函数,但不幸的是有人已经使用过它在包之外(构造函数以前是公共的)< / p>

3 个答案:

答案 0 :(得分:4)

我认为你所寻找的东西与C ++中的friend运算符相当。 Java没有这个(有充分的理由)。

根据这有多糟糕,您可以将公共构造函数标记为已弃用,并切换为使用工厂方法进行仅限程序包的使用。然后将构造函数更改为在另外几个版本中打包私有

长短:一旦你向公众发布了API,你就要么支持它,要么打破他们的构建。

答案 1 :(得分:1)

Java中的可见性是基于包的,它是一个全有或全无的决定,例如你没有像在C ++中声明一个“朋友类”那样的东西。所以我担心没有办法做你想做的事,除了等待项目Jigsaw(看起来像是在Java8中)。

你可以做的一件事是保持构造函数是公共的,但是要将它注释为@Deprecated,并注释它不应该在包之外使用。

除了只有硬解决方案才能删除公众,让它破解,所以其他人需要修复他们的代码。你不会通过这个动作结交新朋友,但是一旦它出来就很难将精灵带回瓶中。现在比以后更好 - 想想像Integer(int)这样的原始包装器的公共构造函数,其中Sun非常错误,并且无法在以后将其取回。

答案 2 :(得分:0)

没有这样的功能。我会尝试找到使用构造函数的现有位置并修复它们。 (如果没有太多)