我想使用a
PriorityQueue
对图进行拓扑排序。为简便起见,我想为比较器使用匿名内部类。但是,我需要访问该图g
才能确定我正在查看的节点的程度。这可能吗?
/**
* topological sort
* @param g must be a dag
*/
public static Queue<String> topoSort(DirectedGraph<String, DefaultEdge> g) {
Queue<String> result = new PriorityQueue<String>(g.vertexSet().size(),
new Comparator<String>() {
DirectedGraph<String, DefaultEdge> g;
@Override
public int compare(String arg0, String arg1) {
if (g.inDegreeOf(arg0) < g.inDegreeOf(arg1)) {
return -1;
}
if (g.inDegreeOf(arg0) > g.inDegreeOf(arg1)) {
return 1;
}
return 0;
}
});
result.addAll(g.vertexSet());
return result;
}
正确的代码
/**
* topological sort
* @param g must be a dag
*/
public static Queue<String> topoSort(final DirectedGraph<String, DefaultEdge> g) {
Queue<String> result = new PriorityQueue<String>(g.vertexSet().size(),
new Comparator<String>() {
@Override
public int compare(String arg0, String arg1) {
if (g.inDegreeOf(arg0) < g.inDegreeOf(arg1)) {
return -1;
}
if (g.inDegreeOf(arg0) > g.inDegreeOf(arg1)) {
return 1;
}
return 0;
}
});
result.addAll(g.vertexSet());
return result;
}
是的,使其最终化:
public static Queue<String> topoSort(final DirectedGraph<String, DefaultEdge> g) {
有关最终关键字,请参见最终词:
匿名本地课程
第二种情况涉及最终变量,实际上是语言语义所规定的。在这种情况下,除非声明为final,否则Java编译器将不允许您使用变量。这种情况出现在闭包(也称为匿名本地类)中。局部类只能引用声明为final的局部变量和参数。
public void doSomething(int i, int j) { final int n = i + j; // must be declared final Comparator comp = new Comparator() { public int compare(Object left, Object right) { return n; // return copy of a local variable } }; }
如果我们阐明如何实现本地类,则此限制的原因显而易见。匿名本地类可以使用本地变量,因为编译器会自动为该类提供一个私有实例字段,以保存该类使用的每个本地变量的副本。编译器还将隐藏参数添加到每个构造函数中,以初始化这些自动创建的私有字段。因此,局部类实际上并不访问局部变量,而只是访问它们自己的私有副本。唯一可以正常工作的方法是将局部变量声明为final,这样可以保证它们不会更改。有了此保证,就可以确保局部类的内部副本变量准确反映了实际的局部变量。
问题内容: 如何在我的匿名内部子类中获取传递给此方法的值? 我收到此错误: 无法在以其他方法定义的内部类中引用非最终变量userID 我很确定我不能将其赋值为final,因为它是一个未知值的变量。我听说这种语法确实以某种方式保留了作用域,所以我认为必须有一个我不太了解的语法技巧。 问题答案: 当然,您可以将其分配为final-只需将该关键字放入参数的声明中即可: 我不确定这是一个未知值的变量是什么
但是,如果我在内部类中声明了一个同名的variabe呢?有什么方法可以显式引用外部变量吗? 顺便说一句,这和这个问题不同,因为它考虑的是局部堆栈变量。
问题内容: 嗨,我正在浏览有关内部类的SCJP书,发现了这一说法,类似这样。 方法本地类只能引用已标记的本地变量 在解释中,指定的原因与本地类对象和堆上的局部变量的范围和生存期有关,但我无法理解。我在这里想念任何东西吗? 问题答案: 原因是,在创建方法本地类实例时,编译器实际上会将其引用的所有方法本地变量复制到其中。这就是为什么只能访问变量的原因。甲变量或参考是不变的,所以它停留在同步与其方法本地
问题内容: 如何从匿名类的方法内部访问? 问题答案: 如何从匿名类的方法内部访问? 您只需要访问它们即可: 更重要的是:为什么这对您不起作用?
问题内容: 除了使用反射来访问匿名内部类的成员之外,还有其他方法吗? 问题答案: 匿名内部类具有类型,但没有名称。 您可以访问未由命名超类型定义的字段。但是,一旦分配给命名类型变量,该接口就会丢失。 显然,您可以从内部类本身内部访问字段。添加代码的一种方法是通过实例初始化程序: 匿名内部类表达式返回的值具有匿名类型,因此您有机会在类本身之外使用它: 您也可以通过声明类似于以下内容的方法传递它: