Доступ к анонимному внешнему классу без сохранения в переменной? - PullRequest
4 голосов
/ 01 апреля 2012

Есть ли способ получить доступ к анонимному внешнему классу?Нормальный класс может быть доступен ClassName.this.Это не работает, поскольку у анонимного класса, очевидно, нет имени.Я также попытался использовать расширенный класс / интерфейс (например, Runnable.this), но не похоже, что он будет работать таким образом.

Я уверен, что это не лучший стиль кодирования, япросто любопытно, если это возможно без сохранения этого внешнего в переменной.

Пример, обратите внимание на external.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 ]

2 голосов
/ 01 апреля 2012

Нет, нет никакого способа получить доступ к анонимным классам из любой точки мира, кроме как изнутри (т. Е. Иначе, чем this ссылка) Или явно объявленной переменной.

final Runnable r1 = new Runnable() {...};
Runnable r2 = new Runnable() {
    public void run() {
         synchronized(r1) {...}
    }
};
1 голос
/ 01 апреля 2012

Вы можете добавить метод для возврата этого среднего 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().

...