我正在使用 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/