2016-12-25 101 views
-3

我的枚舉出現問題。我需要基於枚舉值調用不同的函數,我可以基於開關大小來做到這一點,但它不是我的情況下的解決方案。我有大約50個值。所以我想要做的是將枚舉構造函數中的每個函數與動態運行時值進行傳遞。下面是一些示例代碼片段,使其更加清晰。將論證方法作爲參數枚舉

public enum TestEnum { 

TEST_ENUM1("1", TestUtil.one(name)), 
TEST_ENUM2("2", TestUtil.two(name)); 

private String display; 
private Runnable function; 
private static String name; 
TestEnum(String number,Runnable function){ 
    this.display = number; 
    this.function = function; 
} 

public String getDisplay() { 
    return display; 
} 

public Runnable getFunction() { 
    return function; 
} 

}

和執行該我需要遍歷枚舉薄和呼叫與名稱字段動態值中的每個方法。

 for (TestEnum enumv : TestEnum.values()) { 
     enumv.getFunstion.execute(); 
     } 

如果是的話,是否可以達到同樣的效果請讓我知道最好的方法。謝謝

+0

我不明白你的問題是什麼。你的代碼應該做什麼,它做什麼呢? –

+0

如果你想運行時值,不會傳遞runnable,在執行方法中創建接受參數的自己的接口 – AdamSkywalker

+0

在這種情況下,你可以使用多態。看看[這裏](http://stackoverflow.com/a/126455/6348498)。這將更容易維護和滿足您的要求 – GurV

回答

1

你可以在枚舉中聲明一個抽象方法,然後讓每個後續的枚舉實現給定的方法。當你迭代你的枚舉時,你的每個枚舉都將執行它自己的實現。

public enum MyEnum { 

    FirstEnum { 
     public void myMethod(String args) { 
     } 
    }, 
    SecondEnum { 
     public void myMethod(String args) { 
     } 
    }; 

    public abstract void myMethod(String args); 

} 

這樣就避免了大量if-else語句和開關事件語句,並大大提高了可讀性。

+0

你是用Java寫的嗎?如果是這樣,這是完全錯誤 – Andrew

+0

@editors,爲什麼你應該糾正錯誤的答案,其中有3 +語法錯誤? – Andrew

+0

@AndrewTobilko這個答案有什麼不對?謹慎闡述? –

0

您可以使用command pattern來做到這一點,但我不確定它會比使用switch更簡潔。

public class Main { 

    public static void main(String[] args) { 
     TestEnum.ONE.execute(); 
     TestEnum.TWO.execute(); 
    } 
} 

enum TestEnum { 

    ONE("1", new Command1()), 
    TWO("2", new Command2()); 

    String name; 
    Command command; 

    TestEnum(String name, Command command) { 
     this.name = name; 
     this.command = command; 
    } 

    public void execute() { 
     command.execute(name); 
    } 
} 

interface Command { 

    void execute(String name); 
} 

class Command1 implements Command { 

    @Override 
    public void execute(String name) { 
     System.out.println("Command1: " + name); 
    } 
} 

class Command2 implements Command { 

    @Override 
    public void execute(String name) { 
     System.out.println("Command2: " + name); 
    } 
} 
0

正如@Pavisa所說,您可以爲每個枚舉常量定義抽象方法和實現。

在這種情況下,這個工程:

for (TestEnum enumv : TestEnum.values()) { 
    enumv.getFunstion.execute(); 
} 

但它是難以維持。

您可以使用多態這個更靈活實現:

public interface Action { 
    void doStuff(); 
} 

然後,創建要通過實施行動或延長現有的實現它重用的代碼是什麼功能。

對於和作用中運行它,你可以這樣做:

List<Action> actions = getActions(); 
for(Action action : actions) { 
    action.doStuff(); 
}