Создайте анонимный внутренний класс и вызовите его методы

Я искал это, но, к сожалению, не смог найти совпадений, у меня есть это local anonymous inner class внутри такой метод:

new Object(){
    public void open(){
        // do some stuff
    }
    public void dis(){
        // do some stuff
    }
};

с 2 methods внутри него (open,dis) и я знаю, что если я хочу использовать кого-либо из них, просто сделайте

new Object(){
    public void open(){
        // do some stuff
    }
    public void dis(){
        // do some stuff
    }
}.open()

Теперь мой вопрос: что если я хочу вызвать два метода одновременно? Как я могу это сделать?

3 ответа

Решение

Вы можете создать такой интерфейс:

interface MyAnonymous {
   MyAnonymous open();
   MyAnonymous dis();  //or even void here
}

new MyAnonymous(){
    public MyAnonymous open(){
        // do some stuff
        return this;
    }
    public MyAnonymous dis(){
        // do some stuff
        return this;
    }
}.open().dis();

РЕДАКТИРОВАТЬ ----

Как указывает @Jeff, интерфейс необходим, только если ссылка назначена. Действительно, следующее решение (вызванное @JamesB) полностью верно:

new MyObject(){
        public MyObject open(){
            // do some stuff
            return this;
        }
        public MyObject dis(){
            // do some stuff
            return this;
        }
    }.open().dis();

но это не скомпилирует:

MyObject myObject = new MyObject(){
            public MyObject open(){
                // do some stuff
                return this;
            }
            public MyObject dis(){
                // do some stuff
                return this;
            }
        };
myObject.open().dis();  //not compiling since anonymous class creates a subclass of the class
new MyObject(){
    public MyObject open(){ 
        // do some stuff
        return this;
    }
     public MyObject dis(){ 
        // do some stuff 
        return this;
    }
}.open().dis();

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

interface MyAnonymous {
   void open();
   void dis();
}

MyAnonymous anon = new MyAnonymous () {
    public void open(){
        // do some stuff
    }
    public void dis(){
        // do some stuff
    }
};

anon.open();
anon.dis();
Другие вопросы по тегам