有没有办法访问匿名外层? ClassName.this可以访问普通类。这不起作用,因为匿名类显然没有名称。我也尝试使用扩展类/接口(如Runnable.this),但它看起来不会像这样工作。
我敢肯定这可能不是最好的编码风格,我只是好奇,如果没有将外部存储在变量中就可以。
示例,请注意outer.this:
public class A
{
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
new Thread(new Runnable() {
@Override
public void run() {
synchronized (outher.this) {
outher.this.notify();
}
}
}).start();
try {
synchronized (this) {
wait();
}
} catch (final InterruptedException ex) {}
}
}).start();
}
}
答案 0 :(得分:2)
不,除了从this
引用之外,没有办法从任何地方访问匿名类(除了final Runnable r1 = new Runnable() {...};
Runnable r2 = new Runnable() {
public void run() {
synchronized(r1) {...}
}
};
引用之外)。或者通过显式声明的变量。
{{1}}
答案 1 :(得分:1)
您可以添加一个方法来返回此中间this
。这将是范围但不隐藏(是正确的术语?暗影?我忘了。)。
public static void main(String[] args) {
new Thread(new Runnable() {
Runnable middleThis() { return this; } // <-- this
@Override
public void run() {
new Thread(new Runnable() {
@Override
public void run() {
synchronized (middleThis()) {
middleThis().notify();
注意,尽管匿名内部类没有名称,但它们仍然是类型。因此,立即表达式(new X() { Y z; }.z
)和内部可以看到添加成员。你做不到middleThis().middleThis()
。