2013-03-09 27 views
2

我正在尋找一種方法來爲每個枚舉實例定義一個方法。我們都知道這個頁面底部的代碼構造。在單獨的文件中爲每個枚舉定義方法

我正在尋找的區別是能夠爲編譯時驗證的單獨文件中的每個枚舉定義一個或多個抽象方法。意思是如果有人添加另一個枚舉實例,我會得到一個編譯時錯誤,而不是運行時錯誤,這是我在本頁底部的構造中得到的。

請求的原因是,在我看到的一些代碼中,應該爲每個枚舉定義很多方法,但與枚舉定義非常相關,所以我想將它們放在單獨的文件中,但不是失去了解決這個「標準」方式的好處。

public enum MyEnum { 
X { 
    public void calc(Outer o) { 
     // do something 
    } 
}, 
Y { 
    public void calc(Outer o) { 
     // do something 
    } 
}; 

// abstract method 
abstract void calc(Outer o); 

}

+0

不要忘記枚舉的對象,所以如果我翻譯你說的話是:我想定義這個對象定義之外有關對象的一些方法。這絕對是面向對象的反模式。 – benzonico 2013-03-09 15:09:45

回答

0

你不能定義一個類以外的類的方法!

你可以定義一個回調接口,每個枚舉實例必須有實例:

public interface MyEnumCallback { 
    doStuff(final Outer o) 
} 

那麼你的枚舉將看起來像

public enum MyEnum { 
    X(new XCallback()), 
    Y(new YCallbaxk()); 

    private final MyEnumCallback callback; 

    public MyEnum(final MyEnumCallback callback) { 
    this.callback = callback; 
    } 

    public <Whatever> call(final Outer o) { 
    callback.doStuff(o); 
    } 
} 

這分開你Enum從方法爲你想要的 - 如果有人沒有向Enum實例的構造函數提供MyEnumCallback的實現,它也會拋出編譯時錯誤。

0

考慮如下因素代碼:

interface Delegate{ 
    void calc(); 
} 

enum TestEnum { 

    EnumValue1(new Delegate() { 
     @Override 
     public void calc() { 

     } 
    }), 

    EnumValue2(new Delegate() { 
     @Override 
     public void calc() { 

     } 
    }); 

    private Delegate delegate; 

    TestEnum(Delegate d){ 
     this.delegate = d; 
    } 

    public Delegate getDelegate() { 
     return delegate; 
    } 
} 

public class Test { 
    public static void main() { 
     TestEnum.EnumValue1.getDelegate().calc(); 
     TestEnum.EnumValue2.getDelegate().calc(); 
    } 
} 
相關問題