2011-05-11 84 views
1

我需要在生產環境中隱藏一些菜單選項,但不在開發中。如何更改Spring的枚舉屬性?

我實現了這個像這樣的枚舉:

public enum Functionality { 
    FUNCTION_1(true), 
    FUNCTION_2, 
    FUNCTION_3(true); 

    private boolean usable; 

    Functionality() { 
     this(false); 
    } 

    Functionality(boolean usable) { 
     this.usable = usable; 
    } 

    public boolean isUsable() { 
     return usable; 
    } 
} 

然後,當我需要顯示菜單選項,我檢查該功能是否需要顯示。

所以我需要能夠改變可用布爾當環境是發展。但在春季我找不到任何方法。

你知道一種方式來做這樣的事嗎?

回答

2

可能更改enum的字段,但它通常被認爲是一個壞主意,通常是一種設計氣味。

更好的方法可能是沒有usable是現場所有,而不是使之成爲計算性能:

public enum Functionality { 
    FUNCTION_1(true), 
    FUNCTION_2, 
    FUNCTION_3(true); 

    private final boolean restricted; 

    Functionality() { 
     this(false); 
    } 

    Functionality(boolean restricted) { 
     this.restricted = restricted; 
    } 

    public boolean isRestricted() { 
     return restricted; 
    } 

    public boolean isUsable() { 
     if (!restricted) { 
      return true; 
     } else { 
      return SystemConfiguration.isDevelopmentSystem(); 
     } 
    } 
} 

顯然,將需要像SystemConfiguration.isDevelopmentSystem()這個工作的方法。

在一些系統中,我實現我用另一種enum此:

public enum SystemType { 
    PRODUCTION, 
    TESTING, 
    DEVELOPMENT; 

    public final SystemType CURRENT; 

    static { 
     String type = System.getEnv("system.type"); 
     if ("PROD".equals(type)) { 
      CURRENT = PRODUCTION; 
     } else if ("TEST".equals(type)) { 
      CURRENT = TESTING; 
     } else { 
      CURRENT = DEVELOPMENT; 
     } 
    } 
} 

在這裏,我使用的系統屬性來指定在運行時類型,但任何其他配置類型可能是一樣合適。

-1

Java的枚舉是單身的和不可改變的,所以我不認爲你可以改變反正枚舉狀態。

+0

該語言中沒有指定enum值必須是不可變的。這是一個很好的設計決策和普遍接受的最佳實踐,但不是必需的。 – 2011-05-11 09:19:57

+0

你絕對可以改變一個枚舉的狀態。你只需要在上面的代碼中添加一個setUsable方法。 – 2011-05-11 09:26:45

+0

@ Joachim Sauer&@Thijs Wouters:對於誤會,抱歉,因爲枚舉是單例,所以最好讓它不變。 – blob 2011-05-11 09:30:12