【问题标题】:Choosing a descriptive visibility for members of a private inner class为私有内部类的成员选择描述性可见性
【发布时间】:2017-02-20 10:55:17
【问题描述】:

在我的数据结构类中,我们使用私有内部类来实现红/黑树的Nodes。这种Node是红/黑树独有的,所以内部类的可见性是private。内部类的成员是always accessible from the enclosing class

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

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;
    }

}

this question 中,OP 说private 在语义上是有意义的,而在this answer 中,作者说public 在语义上是有意义的。如果有的话,哪一个是最佳做法?

【问题讨论】:

    标签: java visibility inner-classes


    【解决方案1】:

    最后,这取决于您的编码风格。对于我自己,我倾向于将private 视为“仅在此类内”,即使外部类可以使用它们,所以我将仅在内部类中使用的变量声明为private。我想,与许多其他开发者不同,我将其他所有内容都设为默认(无修饰符)。

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

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

    【讨论】:

    • 我同意private的这个语义。它说明了成员的封装开始和结束的位置。我能看到的一些相互矛盾的做法是“总是使用最窄的可见性”或者“隐藏所有非final成员”,但是Java语言似乎并没有保护内部类的封装,所以我不妨弥补通过明确使用public
    猜你喜欢
    • 1970-01-01
    • 2023-03-07
    • 2013-07-26
    • 1970-01-01
    • 2013-06-13
    • 1970-01-01
    • 2018-11-23
    • 2017-12-22
    • 1970-01-01
    相关资源
    最近更新 更多