2012-04-18 25 views
6

Bir enum oluşturdum ve numaramın sınırsız sayıda parametre alan bir String.format işlemini desteklemesine izin vermeye çalışıyorum. Sadece bir nesne döndürmeyi başardım ve bu yöntemi kullandıktan sonra toString()/döküm yapmam gerekiyor. Bunu yapmak için daha "temiz" bir yol olduğunu veya belki de toString() yöntemini daha iyi geçersiz kılacağını tahmin ediyorum. Temel olarak, toString() yöntemini desteklemek istedim, ancak bunu yapmak için ne yazık ki yapmadım, bu yüzden bu yöntemi oluşturdum. Gördüğünüz gibi text(..) ve toString() değil.Java: enum toString()

Bunu daha iyi nasıl yapabilirim? İstediğim ideal çözüm, bir String döndüren toString(..) gibi bir şeydi. Gittiğin yerde görüyorum

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

Neyi başarmak istediğinizi anlamıyorum. Enum örneğinden hiçbir şey kullanmadığından, bu yöntemi neden bir enum örnek yöntemi yaparsınız? –

+1

Bu yöntem sizin numaranızla nasıl ilişkilidir? Tam olarak ne dönmek istiyorsun? – darrengorman

+0

Kodumu uzattım, birkaç verilen dizgi paramları ile toString() yöntemini desteklemeye çalışıyorum .. – Popokoko

cevap

9

... Bu ne istediğini düşünüyorum (test ettik ve o inşaat):

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

bakış tasarım açısından, ben ederim değil, gerçekten ihtiyacınız olmadıkça metni (yani, alıcıya sahip olmalısınız) yayınlar - text'un biçim dizesi olarak kullanılması gerçeği, bir uygulama seçimidir. Bunu yapmak istiyorum:

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); 
    } 
} 

Bir kenara göre, gerçekten sınıf fikrini seviyorum. Daha önce görmedim.

+0

Mükemmel çözüm, mükemmel çalışıyor, erm, kendimi çözmek için gerçekten çok yakındım, çok teşekkürler! – Popokoko

+0

Bu düşünceyi de beğeniyorum, buna rağmen 'anEnumValue.format (Object o)' gibi bir işlevi kullanıyorum. Bana göre, 'toString' enum değerinin kendisinin bir dize temsilini döndürmelidir, bu yüzden "VALUE_A", "aaa bbb " gibi olacaktır. – thecoshman

+0

@ toString() '* öğesi true olan * bir parametresi (yani, Object'in impl'sini geçersiz kılar), ancak' toString() '* * parametresiyle birlikte *, bu özelliklerin hoşuna gidebilir. Bu deseni kullanan JDK'dan birçok örnek vardır, örneğin ['Integer.toString (int)'] (http://docs.oracle.com/javase/7/docs/api/java/lang/Integer. html # toString (int)). – Bohemian

4

Daha fazla parametre iletmeniz gerekiyorsa, toString() geçersiz kılma yapamazsınız (toString() almıyor). Basitçe enum yeni bir yöntem tanımlamak gerek geçersiz kılmak için: Geçerli nesnenin dize olarak temsil dönen değil çünkü bu yöntemi toString() isim olmamalı

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

, kafa karıştırıcı olurdu, bunun yerine Parametre olarak iletilen nesnelerin biçimlendirilmiş bir dizesini döndürüyorsunuz. Ayrıca, text() yöntemi, getText() olarak adlandırılmalıdır, bu Java sözleşmesidir.

İade edilen dizenin herhangi bir dize olmadığını açıkça belirten bir ad kullanın - bu, parametrenin biçimlendirilmesini bekleyen bir biçimlendirilmiş dizedir - getAsFormattedText() açıkça bunu ifade eder.

+0

Birisi hiçbir paramdan geçmek istemediğinde ama parametresiz toString'i aldığında çok kafa karıştırıcı. –