访问匿名外部类而不存储变量?

时间:2012-04-01 17:54:48

标签: java syntax anonymous-class

有没有办法访问匿名外层? 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();
    }
}

2 个答案:

答案 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()