我正在浏览一段代码,它是这样的
// 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;
}
}
为什么我们在私有(private)静态类中有这样的公共(public)方法。如果我做了 ROrder 会有什么害处
- 非静态
- 公开
最佳答案
ROrder
Non-Static
通过使其成为非静态
,您将需要容器类的实例来创建ROder
的实例,这可能是由于类的设计不会做逻辑。只有当你确实需要外部类的实例来获取内部类的实例时,你才应该保持类非静态。
ROrder
Public
同样是因为他们想限制在此类上下文之外使用 ROrder
。他们不希望任何客户端代码或其他代码随意创建 ROrder
的实例,因为它们没有任何用处。
Why do we have such public methods inside private static classes.
在这种情况下,因为您正在实现一个 interface
Comparator
并且您将传递此比较器用于其他用途,例如排序,并且您需要 Collections
类具有compare
方法的可见性,因此该方法必须是public
,即使实现该接口(interface)的类是private
。
所以这只是增强代码的可读性和使用意图的合乎逻辑的方法。
逻辑使用
此类希望字符串采用某种格式。
public class SomeClass{
private static class StringHelper{
//will do the task of parsing and validating that string object
}
}
现在在这种情况下,您不希望保留 StringHelper
类 public
,因为它的使用过于本地化而无法重用。所以你宁愿通过保持它 private
来强调这一点。如果 StringHelper
实现了一些接口(interface),则可以有 public
的方法。
更新:
You should keep class non-static only when you really need the instance of outer class to get the instance of inner class.
关于这一点,我认为答案可能过于宽泛,但我会尽量简短地解释一下。我的意思是,如果内部类对象共享其处理所依赖的外部对象的某些状态,那么您将需要的对象外部类与内部类对象共享其状态,但是如果内部类实例独立于外部类的状态,那么保留内部类是安全的 静态
。
关于java - 为什么私有(private)类中有公共(public)方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18868462/