Java 为私有内部类的成员选择描述性可见性

Java 为私有内部类的成员选择描述性可见性,java,visibility,inner-classes,Java,Visibility,Inner Classes,在我的数据结构类中,我们使用私有内部类实现红/黑树的节点。这种节点是红/黑树所独有的,因此内部类的可见性是私有的。内部类的成员是 我应该如何为这个内部类的成员选择可见性?如果编译器没有区别,那么哪种可见性在语义上最有意义 public class RedBlackTree<K extends Comparable<? super K>, V> { private static enum NodeColor { RED, BLACK } private

在我的数据结构类中,我们使用私有内部类实现红/黑树的
节点。这种
节点
是红/黑树所独有的,因此内部类的可见性是
私有的
。内部类的成员是

我应该如何为这个内部类的成员选择可见性?如果编译器没有区别,那么哪种可见性在语义上最有意义

public class RedBlackTree<K extends Comparable<? super K>, V> {

    private static enum NodeColor { RED, BLACK }

    private class Node {
        private final K key; // these are private, currently for no particular reason
        private V value;
        private Node left;
        private Node right;
        private NodeColor color;

        private Node(K key, V value, NodeColor color) {
            this.key = key;
            this.value = value;
            this.color = color;
        }
    }

    // Precondition - both children are red, and node is black.
    // Postcondition - both children are black, and node is red.
    private void colorFlip(Node node) {
        node.color = NodeColor.RED;
        node.left.color = NodeColor.BLACK; // these statements compile, as expected
        node.right.color = NodeColor.BLACK;
    }

}

最后,这取决于您的编码风格。就我自己而言,我倾向于将
private
视为“仅在此类内”,即使外部类可以使用它们,因此我将仅在内部类中使用的变量声明为
private
。我想,与许多其他开发人员不同的是,我将其他一切都设置为默认(没有修改器)

不过,老实说,为“非私有”成员使用
public
可能是一个更好的主意,因为查看您的代码的其他人会知道,您打算在内部类之外使用该成员


只要您不想编写不必要或低效的代码(例如
private
内部类的
private
字段的getter/setter),您就可以遵循任何您喜欢的范例。如果你正在与他人合作或在一个小组项目中工作,试着跟随当前的趋势。

我同意
private
的这个语义含义。它说明了成员封装的开始和结束位置。我所看到的一些相互冲突的实践是“始终使用尽可能狭窄的可见性”或“隐藏所有非最终成员”,但Java语言似乎无法保护内部类的封装,因此我最好通过使用
public
显式来弥补这一点。