2012-04-18 215 views
6

我創建了一個枚舉,我試圖讓我的枚舉支持一個String.format操作,獲取無限數量的參數返回一個字符串。 我只設法返回一個對象,在使用這個方法之後,我必須做一個toString() /施放。我猜測有一種更「乾淨」的方式來做到這一點,或者可以更好地覆蓋toString()方法。基本上,我想支持toString()方法,但遺憾的是沒有設法做到這一點,所以我創建了這種方法。正如你所看到的,它被命名爲text(..)而不是toString()爪哇:enum toString()

我該如何做得更好?我想要的理想解決方案就像返回字符串的toString(..)

public enum MY_ENUM { 

    VALUE_A("aaa %s"), VALUE_B("bbb %s"); 

    private String text; 

    MY_ENUM(String text) { 
     this.text = text; 
    } 

    public String text() { 
     return this.text; 
    } 

    public Object text(final Object... o) { 
     return new Object() { 
      @Override 
      public String toString() { 
       return String.format(text(), o); 
      } 
     }; 
    } 
} 
+3

我不明白你想達到什麼目的。爲什麼使這個方法成爲一個枚舉的實例方法,因爲它不使用枚舉實例中的任何東西? – 2012-04-18 18:38:09

+1

這種方法如何與你的枚舉相關?你想讓它完全返回嗎? – darrengorman 2012-04-18 18:38:43

+0

我擴展了我的代碼,即時嘗試支持一個給定的字符串參數很少的toString()方法.. – Popokoko 2012-04-18 18:45:33

回答

9

我看到你要去哪裏?我想這是你想要的(經測試,和它的作品):

public String toString(Object... o) { 
    return String.format(text, o); 
} 

對於設計的角度來看,我不發佈文本(即有getter),除非你真的需要 - text被用作格式字符串的事實是一種實現選擇。我只是這樣做:

public static enum MY_ENUM { 

    VALUE_A("aaa %s bbb %s"), 
    VALUE_B("bbb %s"); 

    private final String text; 

    MY_ENUM(String text) { 
     this.text = text; 
    } 

    public String toString(Object... o) { 
     return String.format(text, o); 
    } 
} 

另外,我真的很喜歡這個班的想法。以前沒見過。

+0

偉大的解決方案,完美的工作,嗯,我真的接近自己解決它,非常感謝! – Popokoko 2012-04-18 18:58:45

+0

我也喜歡這個想法,儘管我更喜歡使用更像'anEnumValue.format(Object o)'的函數。對我來說,'toString'應該返回枚舉值本身的字符串表示形式,所以'VALUE_A'就像「aaa bbb 」。 – thecoshman 2014-11-04 09:07:58

+0

@thecoshman對於'toString()'*是沒有參數的(即覆蓋Object的impl),但帶有*參數的'toString()'*可以做它喜歡的東西。有很多來自JDK的例子使用這種模式,例如['Integer.toString(int)'](http://docs.oracle.com/javase/7/docs/api/java/lang/Integer。 HTML#的ToString(INT))。 – Bohemian 2014-11-04 11:39:56

4

如果您需要傳遞更多參數(toString()未收到任何),則無法覆蓋toString()。簡單地定義在枚舉了新的方法,不需要重寫:

public String getAsFormattedText(Object... o) { 
    return String.format(text, o); 
} 

你不應該命名此方法toString(),這將會是令人困惑,因爲你沒有返回當前對象的字符串表示,而不是您將返回一個格式化的作爲參數傳遞的對象的字符串。另外,text()方法應該叫做getText(),這是Java約定。

更好地使用一個清楚地表明返回的字符串不是任何字符串的名稱 - 它是一個格式化的字符串,需要將文本格式化爲參數 - getAsFormattedText()明確表示這一點。

+0

當有人不想傳遞任何參數,但獲取無參數toString時,會非常困惑。 – 2013-07-01 11:35:05