为什么在私有类中有公共方法?

时间:2013-09-18 09:25:16

标签: java

我正在浏览代码的一部分,就像这样

// compare points according to their polar radius
public static final Comparator<Point2D> R_ORDER = new ROrder();
.
.
.
private static class ROrder implements Comparator<Point2D> {
    public int compare(Point2D p, Point2D q) {
        double delta = (p.x*p.x + p.y*p.y) - (q.x*q.x + q.y*q.y);
        if (delta < 0) return -1;
        if (delta > 0) return +1;
        return 0;
    }
}

为什么我们在私有静态类中有这样的公共方法。如果我制作ROrder会有什么害处

  1. 非静态
  2. 公开

4 个答案:

答案 0 :(得分:9)

  

ROrder非静态

通过使它成为non-static,您将需要容器类的实例来创建ROder的实例,这可能是由于类的设计不会产生逻辑。只有在真正需要外部类的实例来获取内部类的实例时,才应该保持类非静态。

  

ROrder公开

同样是因为他们想限制在这个类的上下文之外使用ROrder。他们不希望任何客户端代码或其他代码自由创建ROrder的实例,因为它们没有任何用处。

  

为什么我们在私有静态类中有这样的公共方法。

在这种情况下,因为您正在实现interface Comparator并且您将传递此比较器用于其他用途,例如排序,您希望Collections类具有compare方法,因此即使实现接口的类为public,该方法也必须为private

因此,这只是 增强代码的可读性 使用意图 的合理方式。

逻辑使用

这个类希望字符串采用某种格式。

public class SomeClass{

     private static class StringHelper{
          //will do the task of parsing and validating that string object
     } 
}

现在,在这种情况下,您不希望保留StringHelperpublic,因为它的使用太局部化而无法重复使用。所以你宁愿通过保持private来强调它。如果public实现了一些接口,则可以有StringHelper的方法。

UPDATE:

  

只有当你真正需要时才应该保持非静态类   获取内部类实例的外部类的实例。

关于这一点,我认为答案可能过于宽泛,但我会试着简单解释一下。我的意思是,如果内部类对象 共享其处理依赖的外部对象的某些状态 ,那么您将需要的对象外部类与内部类对象共享其状态 ,但如果内部类实例独立于外部类的状态,那么保持内部类{{1 }}

答案 1 :(得分:4)

此类实现Comparator,因此必须实现其方法。实现方法不能是static。此外,由于接口方法是隐式public,因此无论包含类的可见性如何,都必须将它们声明为public。不要这样做,它将无法编译。这肯定是在这里宣布public的原因 - 它不可能是。

无论包含类是static还是public,都是如此。在这里,它可能是其中之一,内部的方法仍然必须是public和非static

其他没有实现接口的方法可能是private,并且在逻辑上可能应该在private类中,因为否则没有任何意义 - 但是它是允许的通过Java语法。

答案 2 :(得分:1)

所有私有成员(字段,类,等等)仅在类中可见。因此,为私有类提供方法的可见性并不重要 - 所有方法只能在包含类中可见,因为类本身是私有的。

如果内部类实现了接口或扩展了类,则重写方法的可见性可能不会超出超类型中的声明,因此这是在私有内部类中使用公共方法的一个原因。

但是,尽管语法允许私有类具有公共方法,但它不会将这些方法的可见性充分提高到在包含类之外可见。在修饰符的java中有几个例子是合法的但没有效果,例如内部接口是隐式静态的(无论是否使用静态关键字)。

答案 3 :(得分:0)

这个类是私有的,因为开发人员不希望在其他地方实例化ROrder。但是可以通过其他类的常量R_ORDER访问实例。

该方法公开有两个原因:首先,在compare接口中定义Comparator。其次,由于可以从其他类访问R_ORDER,因此能够在此对象上调用方法非常方便。在这种情况下,它是compare

最后,如果该类不是静态的,它将保留对父类的引用,这几乎总是不需要的