在Eclipse中,如何将匿名接口实现重构为Enum Singleton

时间:2011-08-17 13:32:46

标签: java eclipse interface enums refactoring

假设我有一个界面:

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

现在在一些Java代码中,我有一个匿名的接口实现:

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

有没有办法(在Eclipse中)将它重构为枚举单例模式(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技巧(我正在使用Indigo)?

BTW:Idea或NetBeans是否支持这种重构?

3 个答案:

答案 0 :(得分:2)

没有办法。

顺便说一下,做这样的事情会更常见:

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); 
    }
}

即使它们被定义为“INSTANCE1(0)”,你仍然可以将它们称为代码中的“INSTANCE1”;即StandardFoo.INSTANCE1.bar(123)

也许在枚举中添加一个私有字段来协助实现该方法,通过(私有)构造函数设置。

答案 1 :(得分:2)

重构“将匿名类转换为嵌套”是诀窍的一部分。您必须将类更改为枚举,并用枚举单例替换ctor调用。

答案 2 :(得分:1)

IDEA支持Structural Search and Replace(教程),我相信可以为您加快速度。