r******l 发帖数: 10760 | 1 Java里面的anonymous class只能使用final的变量。如果我需要使用普通变量,下面两
个做法那个好呢?
1. 定义一个新的final变量
int abc;
public void TestMethod() {
final int finalAbc = abc;
xxx.queueEvent(new Runnable() {
@Override
public void run() {
finalAbc.foo();
finalAbc.bar();
}
});
}
2. 定义一个新的Runnable的子类,这样就可以直接用非final的变量了
int abc;
class myRunnable implements Runnable {
@Override
public void run() {
abc.foo();
abc.bar();
}
}
public void TestMethod() {
final int finalAbc = abc;
xxx.queueEvent(new myRunnable());
} |
g*****g 发帖数: 34805 | 2 不如 wrap进一个方法,在方法里用 final. 代码干净。
【在 r******l 的大作中提到】 : Java里面的anonymous class只能使用final的变量。如果我需要使用普通变量,下面两 : 个做法那个好呢? : 1. 定义一个新的final变量 : int abc; : public void TestMethod() { : final int finalAbc = abc; : xxx.queueEvent(new Runnable() { : @Override : public void run() { : finalAbc.foo();
|
r******l 发帖数: 10760 | 3 啥意思啊?我不怎么会Java,能否给个例子?多谢!
【在 g*****g 的大作中提到】 : 不如 wrap进一个方法,在方法里用 final. 代码干净。
|
w**z 发帖数: 8232 | 4 不熟Java, 就远离anonymous inner class
【在 r******l 的大作中提到】 : 啥意思啊?我不怎么会Java,能否给个例子?多谢!
|
k**********g 发帖数: 989 | 5
让我介绍一下为什么有这奇怪的final规定。
https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html#
accessing
这个anonymous class,如果它用到了任何local variable,这local variable是会被
anonymous class 捕获(capture)。这捕获的意思是:(1)anonymous class会有一
个同名的field,这很容易理解,(2)the enclosing scope (正在尝试创建这个
anonymous class 的函数)如引用这个local variable name,其实它是直接在引用
anonymous class里的field,因此这个variable已经不再是local variable。它的
lifetime 就是这个anonymous class 的lifetime 。
correct me if wrong
【在 r******l 的大作中提到】 : 啥意思啊?我不怎么会Java,能否给个例子?多谢!
|
r******l 发帖数: 10760 | 6 我这不是来学习吗?谁一生下来就熟Java啊?
【在 w**z 的大作中提到】 : 不熟Java, 就远离anonymous inner class
|
c*********e 发帖数: 16335 | 7 下面这个连接的第一个大的答案makes sense.
http://stackoverflow.com/questions/4732544/why-are-only-final-v
【在 k**********g 的大作中提到】 : : 让我介绍一下为什么有这奇怪的final规定。 : https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html# : accessing : 这个anonymous class,如果它用到了任何local variable,这local variable是会被 : anonymous class 捕获(capture)。这捕获的意思是:(1)anonymous class会有一 : 个同名的field,这很容易理解,(2)the enclosing scope (正在尝试创建这个 : anonymous class 的函数)如引用这个local variable name,其实它是直接在引用 : anonymous class里的field,因此这个variable已经不再是local variable。它的 : lifetime 就是这个anonymous class 的lifetime 。
|
c*********e 发帖数: 16335 | 8 用final 其实还是可以改数据啊。比如
final int[] res = new int[1];
Runnable r = new Runnable() { public void run() { res[0] = 123; } };
r.run();
System.out.println(res[0]);
http://stackoverflow.com/questions/4732544/why-are-only-final-v
【在 g*****g 的大作中提到】 : 不如 wrap进一个方法,在方法里用 final. 代码干净。
|
c*********e 发帖数: 16335 | 9 int后面有个foo() method?
Integer后面可以跟一个foo() method吧?
【在 r******l 的大作中提到】 : Java里面的anonymous class只能使用final的变量。如果我需要使用普通变量,下面两 : 个做法那个好呢? : 1. 定义一个新的final变量 : int abc; : public void TestMethod() { : final int finalAbc = abc; : xxx.queueEvent(new Runnable() { : @Override : public void run() { : finalAbc.foo();
|
r******l 发帖数: 10760 | 10 嗯,例子举的不好,把int改成mytype吧。反正就是这么个意思,呵呵。
【在 c*********e 的大作中提到】 : int后面有个foo() method? : Integer后面可以跟一个foo() method吧?
|
a*******a 发帖数: 1240 | 11 final的意思是,因为在 anonymous class里,要避免出现 undeterministic的问题。 |