java - 在内部私有(private)类中包含非私有(private)数据成员是否有效?

标签 java oop

我正在使用 Java 工作,并且遇到一些 OOP 哲学问题。 OOP 的良好实践是使所有数据成员私有(private)(如果可能的话最终),我同意。但是,我认为在某些情况下,我们可以在不丢失封装的情况下违反此规则,例如,仅用于内部目的的私有(private)内部类,它的数据成员可以是公共(public)的,并且没有外部类可以修改它。

更具体地说,作为面试准备的一部分,我正在实现一些数据结构,这是我第一次尝试实现 LinkedList Node 类:

class Node<T> {
    private T value;
    private Node<T> nextNode;

    public Node(T value)
    {
        this.value = value;
        nextNode = null;
    }

    public Node<T> getNext()
    {
        return nextNode;
    }

    public void setNext(Node<T> next)
    {
        nextNode = next;
    }

    public T getValue()
    {
        return value;
    }

    public void setValue(T v)
    {
        value = v;
    }
}

此类仅在我的LinkedList 类中使用。我认为对于一个简单的 Node 类来说代码太多了,这个其他实现将大大减少源代码的大小:

class Node<T> {
    T value;
    Node<T> next = null;
}

我发现即使是 Java 开发人员也在 JDK 源代码中使用这种做法,例如 HashMap 实现中的 Entry 类:

static class Entry<K,V> implements Map.Entry<K,V> {
    final K key;
    V value;
    Entry<K,V> next;
    int hash;
    .
    .
    .
}

这使得代码更加紧凑。

某些语言(例如 C# 或 PHP)提供了更自然地访问数据成员的方法,例如:

public string name
{
    get { return _name;  }
    set { _name = value; }
}

但是在 Java 中我们必须创建访问器方法。

在我看来,在私有(private)内部类中拥有非私有(private)数据成员是有效的,但我不是 OOP 专家,我不想在面试中提出危险信号。

我知道询问意见的问题通常是封闭的,但我确实需要专家的一些观点。

最佳答案

私有(private)内部类是类实现的一部分,对外部隐藏,因此从面向对象的角度来看,您可以自由地做任何您想做的事情。您不会以任何方式破坏封装。

您实际上可以将内部类中的变量声明为private,并从包含类中不受限制地访问它们。但是,如果您决定更喜欢使用方法来读取和写入它们,则由您决定。如果您决定更改某些内容,访问器方法将为您提供更大的灵活性,但需要更改的内容仅限于包含的类。

关于java - 在内部私有(private)类中包含非私有(private)数据成员是否有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23143259/

相关文章:

java - 在布局中添加按钮时出现 java.lang.reflect.InitationTargetException

Java Try With Resources - 关闭资源的顺序

php - MySQL 查询生成器 PHP 类

c++ - 在同一个类的析构函数中调用类的构造函数

java - 使用 Guava 缓存减少样板的方法

java - 从 Redis 获取 key

c++ - uml中的模板方法

java - 权利继承顺序

c# - 值类型如何实现引用类型

java - 如何添加安全防护来释放本应由客户端代码显式释放的资源