В Eclipse, как реорганизовать реализацию анонимного интерфейса в Enum Singleton - PullRequest
3 голосов
/ 17 августа 2011

Допустим, у меня есть интерфейс:

public interface Foo{
    String bar(int baz);
}

Теперь в некотором коде Java у меня есть анонимная реализация этого интерфейса:

Foo foo = new Foo(){
    public String bar(int baz){
        return String.valueOf(baz);
    }
};

Есть ли способ (в Eclipse) перенастроить его в одноэлементный шаблон enum (Effective Java, Item 3), например:

// further up in the same Compilation Unit:
enum StandardFoo implements Foo{
    INSTANCE{
        public String bar(int baz){
            return String.valueOf(baz);
        }
    }
}

// ...
Foo foo = StandardFoo.INSTANCE;

Этот рефакторинг делать утомительно вручную, и я делаю это все время. Есть ли плагин, который делает это? Или секретный трюк JDT, о котором я не знаю (я использую Индиго)?

Кстати: поддерживает ли Idea или NetBeans этот рефакторинг?

Ответы [ 3 ]

2 голосов
/ 17 августа 2011

Рефакторинг «Преобразование анонимного класса во вложенный» делает часть уловки. Вы должны изменить класс на enum и заменить вызов ctor на синглтон enum.

2 голосов
/ 17 августа 2011

Нет никакого способа.

кстати, было бы более привычным сделать что-то вроде этого:

enum StandardFoo implements Foo {
    INSTANCE1(0),
    INSTANCE2(5);

    private final int delta;

    private StandardFoo(int delta) {
        this.delta = delta;
    }

    public String bar(int baz) {
        // Simple example to demonstrate using fields in enum methods
        return String.valueOf(baz + delta); 
    }
}

FYI, даже если они определены как "INSTANCE1 (0)",вы по-прежнему называете их просто "INSTANCE1" в коде;т.е. StandardFoo.INSTANCE1.bar(123) etc

Возможно добавление приватного поля в перечисление, чтобы помочь с реализацией метода, установленного через (приватный) конструктор.

1 голос
/ 17 августа 2011

IDEA поддерживает Структурный поиск и замену (Учебное пособие), что, я считаю, может ускорить это для вас.

...