在java/内部方法可见性中使用内部类为外部类创建私有记录
我必须在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
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。在您的例子中,这是
。