在java/内部方法可见性中使用内部类为外部类创建私有记录

在java/内部方法可见性中使用内部类为外部类创建私有记录,java,visibility,inner-classes,Java,Visibility,Inner Classes,我必须在Java中实现一个名为Graph的接口 假设MyGraph是我为实现Graph而编写的类 我想创建一个内部类节点,以便“封装”类型E的元素 public class MyGraph<E extends Comparable<E>> implements Graph<E>{ MyGraph methods and instance variables... . . . class Node { E ele

我必须在Java中实现一个名为
Graph
的接口

假设
MyGraph
是我为实现Graph而编写的类

我想创建一个内部类
节点
,以便“封装”类型
E
的元素

public class MyGraph<E extends Comparable<E>> implements Graph<E>{


  MyGraph methods and instance variables...
  .
  .
  .



    class Node {
        E elem;
        List<E> edges;
        ...
        public Node(E e){
           this.elem = e;
           edges = null;
        }
    }
}
公共类MyGraph实现图形{
MyGraph方法和实例变量。。。
.
.
.
类节点{
E元素;
列出边缘;
...
公共节点(E){
这个。elem=e;
边=空;
}
}
}
问题是我无法理解内部类是否应该是
Node
Node
public
private
,以及它的实例变量是否应该声明为
public
private
。我将在
节点中插入的一些最终方法也是如此


基本上,类节点应该类似于C中的记录类型(带有
typedef
),外部类应该能够访问节点的所有实例变量,而无需观察者getter,等等。

您应该声明节点类private static,因为它不需要访问外部类的成员。如果不这样做,则每个实例都将携带对实例化实例的引用。您需要给它一个参数来执行此操作


如果使用E作为参数名,它将在外部类中隐藏E,所以考虑清楚,给它一个不同的名称。您的外部类将拥有对节点成员的完全访问权限,如果节点是私有的,则没有其他类具有访问权限,因此您无需担心成员的访问级别,只需忽略它们即可。

您的
节点
应为
私有
类,因为它是
MyGraph
定义的一部分,不应该被外部类访问和修改。您正在对节点执行一些计算,这些节点是图形的一部分。您不需要将其参数化,因为它已经属于参数化类(即
MyGraph
)。看一看普林斯顿提供的关于Java算法的优秀资源,您应该声明Node类
private static
,因为它不需要访问外部类的成员。如果不这样做,则每个实例都将携带对实例化实例的引用。您需要给它一个参数来执行此操作。如果使用E作为参数名,它将在外部类中隐藏E,因此考虑清楚地赋予它不同的名称。您的外部类将拥有对
节点
成员的完全访问权限,如果
节点
是私有的,则其他类将无权访问,因此您不必担心成员的访问级别,只需忽略它们即可。@teppic您能解释一下这是什么意思吗“如果不这样做,则每个实例都将包含对实例化实例的引用”@GerardoZinno:内部类可以访问封闭实例的方法和字段。要实现这一点,内部类的每个实例都有对其父实例的隐式引用,
MyGraph。在您的例子中,这是