Java 访问匿名外部类而不存储在变量中?
有没有办法访问匿名外部类?普通类可以通过ClassName.this访问。这不起作用,因为匿名类显然没有名称。我也尝试过使用扩展类/接口(比如Runnable.this),但它似乎无法以这种方式工作 我确信这可能不是最好的编码风格,我只是好奇是否可以不将外部的这一部分存储在变量中Java 访问匿名外部类而不存储在变量中?,java,syntax,anonymous-class,Java,Syntax,Anonymous Class,有没有办法访问匿名外部类?普通类可以通过ClassName.this访问。这不起作用,因为匿名类显然没有名称。我也尝试过使用扩展类/接口(比如Runnable.this),但它似乎无法以这种方式工作 我确信这可能不是最好的编码风格,我只是好奇是否可以不将外部的这一部分存储在变量中 final Runnable r1 = new Runnable() {...}; Runnable r2 = new Runnable() { public void run() { syn
final Runnable r1 = new Runnable() {...};
Runnable r2 = new Runnable() {
public void run() {
synchronized(r1) {...}
}
};
例如,请注意外部。此:
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();
}
}
不,除了从匿名类内部(即通过
此
引用之外),无法从任何地方访问匿名类。或者通过显式声明的变量
final Runnable r1 = new Runnable() {...};
Runnable r2 = new Runnable() {
public void run() {
synchronized(r1) {...}
}
};
您可以添加一个方法来返回此中间
this
。它会在范围内,但不会隐藏(这是正确的术语吗?阴影?我忘了)
publicstaticvoidmain(字符串[]args){
新线程(newrunnable()){
Runnable middleThis(){return this;}//你认为它能与匿名类的synchronized(this.getClass().getEnclosuringClass())一起工作吗?@Eric R.我认为这会与DiddiZ发布的内容有所不同(也许你的建议是DiddiZ真正想要的)。假设main
方法在许多不同的线程中同时执行。在DiddiZ的代码中,它们都在不同的对象上同步-因此没有冲突。在您的代码中,它们都在同一个对象上同步,因此会有一些冲突。但我怀疑您的代码是DiddiZ真正想要的。我s按类而不是按实例同步。如果将同步监视器更改为已同步(this.getClass().getEnclosuringClass())和已同步(this.getClass())(而不是已同步(this))这是可行的。但是,如果在同一个可运行实例上运行多个线程,它将像一个静态同步的实例,即跨所有实例。这是一种巧妙的方法,可以绕过“无需存储在变量中”的限制。