2013-05-21 33 views
1

我有一個狀態標籤,顯示一條帶有彩色邊框的消息,根據當前狀態 。該消息本身可能會有所不同(也就是說,可能會有多個 消息到ERROR),但CLEAR的狀態是不同的,因爲它永遠不會顯示任何消息 。如何建模一個常數「行爲」不同的枚舉?

用法示例

setStatus(INFORMATION, "There are new cookies in the jar."); 
setStatus(ERROR, "You were to slow."); 
setStatus(ERROR, "Stop bugging me, you were to slow."); 
clearStatus(); 

我怎麼能模擬這種特殊的狀態CLEAR?我應該從 枚舉中刪除它嗎?我已將它列入枚舉中,因爲CLEAR是一個有效的 狀態,只是它不顯示消息。然而,客戶可致電:

setStatus(CLEAR, "ups, I gave you a message"); 

什麼其他選擇在那裏所有,但一個是 性質相等值的列表模型?

public class StatusLabel { 
    public enum Status { 
     CLEAR, 
     INFORMATION, 
     ERROR; 
    } 

    Status status = Status.CLEAR; 

    public void setStatus(final Status status, final String message) { 
     assert status != STATUS.CLEAR; 
     // set status and a show message 
     this.status = status; 
    } 

    public void clearStatus() { 
     // clear message 
     status = Status.CLEAR; 
    } 

    public Status getStatus() { 
     return status; 
    } 
} 
+0

我會很好''assert'或拋出異常。可選地,也許你可以確保如果'status'是'CLEAR',那麼'getStatus()'總是返回'null'(醜陋,我知道) – SJuan76

+0

我不想醜陋:-)。我也希望在編譯時有一個解決方案(在執行時斷言觸發器)。然而,謝謝。 –

+1

在編譯時,我能想到的唯一事情就是實現接口的幾個類。接口定義了'getMessage()'; 'Information'和'Error'有一個接受'String'的構造函數,'Clear'有默認的構造函數。 – SJuan76

回答

0

我會在狀態枚舉「displaysMessage」上放置一個屬性。然後,你可以問問狀態枚舉,如果你應該顯示消息。

1

儘管我認爲像NONE或甚至null這樣的特殊值絕對沒問題,但對枚舉值的不同行爲進行建模沒有問題。你必須考慮,每一個這些值都可以擁有自己的類,因此它是自己獨特的行爲。

public class StatusLabel { 
     public enum Status { 
      NONE { 
       public void show(String msg) { 
        throw new IllegalArgumentException("don't show CLEAR!"); 
       } 
      }, 
      INFORMATION, 
      ERROR; 
      public void show(String msg) { 
       // do what ever needed 
      } 
     } 

     Status status = Status.NONE; 

     public void setStatus(final Status status, final String message) { 
      status.show(message); 
      this.status = status; 
     } 

     public void clearStatus() { 
      // clear message 
      status = Status.NONE; 
     } 

     public Status getStatus() { 
      return status; 
     } 
    } 

這樣枚舉值真的表現不同。

+0

但是不同的消息不能以相同的狀態顯示,即'setStatus(ERROR,「foo」);''setStatus(ERROR,「bar」);'是不可能的。 –

+0

我從'show'瞭解到的是同步無狀態操作,如打開警告框並等待用戶按下'OK'。您可以經常這樣做,因爲您的用戶每次都可能使用不同的消息訪問它,因爲它作爲參數提供,並且不會保存。實際上它不能被保存在一個枚舉中。那麼,你的問題到底是什麼? –