java – 你什么时候想要一个公共实例变量?

我昨天编写了自己的LinkedList实现.我做的是这样的:

public class Node
{
    Node next;
    int value;

    public Node()
    {
       next = null
       value = 0;
    }
}

然后在使用Node时我正在做node.next和node.value.然后我意识到 – 等等,我到底在做什么?这些实例变量应该是私有的,然后我应该使用getter()和setter()来访问getNext()和setValue().

这让我想知道,除了私有实例变量之外还需要什么?

最佳答案
从技术上讲,你提出两个问题:标题问题,“什么时候有一个公共实例字段”,以及你的最后一句话,“什么时候有一个非私人实例字段是合适的.”

什么时候有一个公共实例字段?几乎每个人都知道答案几乎从来没有.我认为它们偶尔适用于非常小的值类,其行为类似于简单的C结构.一个很好的例子是java.awt.Point和java.awt.Dimension.

这些实际上是特别好的例子,因为它们最终演变为使用访问器方法,尽管它们很简单,这是一个很好的教训:即使是看起来如此简单以至于公共字段看起来可以接受的类也很有可能成为需要封装的东西. . (Point和Dimension继续保留这些公共字段以实现向后兼容.)

什么时候适合拥有非私有实例字段?大多数人没有利用这样的事实:没有访问修饰符的字段和方法(和类)是包私有的,但是包私有字段在很多情况下都很有用.由于它们只能通过相同的包访问,因此通常情况下它是您的代码,您可以相信自己不会做会损坏对象的“坏事”.我会说,包私有字段的合法用途比公共字段要多得多.

也就是说,Point / Dimension规则仍然适用:有很多次我认为我可以使用包私有字段,但后来发现我需要通过get-和set-methods进行封装.

受保护的字段可能会得到更多的使用.在我看来,让子类直接修改状态而不是通过方法很少有很大的好处.

转载注明原文:java – 你什么时候想要一个公共实例变量? - 代码日志