1 回答

TA貢獻(xiàn)1874條經(jīng)驗(yàn) 獲得超12個(gè)贊
tl;博士
在設(shè)置器中,我想檢查傳入的參數(shù)是否是我的 Color 枚舉的一部分。
錯(cuò)誤的做法。您應(yīng)該傳遞一個(gè) object,您的枚舉對(duì)象之一,而不是顏色名稱的文本。
請(qǐng)參見poster.setBackgroundColor( Color.GREEN )
下面的示例。
這就是在 Java 中使用枚舉的要點(diǎn):讓編譯器在編譯時(shí)檢查是否傳遞了有效值,而不是擔(dān)心在運(yùn)行時(shí)驗(yàn)證代碼。
細(xì)節(jié)
看起來你在混淆一些東西。您可能混淆了枚舉實(shí)例(一個(gè)常量)、它的硬編碼名稱以及您可能希望在運(yùn)行時(shí)向用戶顯示的名稱。
AnEnum
是一種方便地實(shí)例化預(yù)定數(shù)量的類實(shí)例的方法,每個(gè)實(shí)例都被分配一個(gè)預(yù)定的名稱。例如,Month
,Month.JANUARY
通過Month.DECEMBER
。
常數(shù)名稱
如果您想要實(shí)例的硬編碼名稱,按照約定全部大寫(作為常量),然后調(diào)用toString
.
String constantName = Month.JANUARY.toString() ;
一月
這里要非常清楚:String
帶有文本“JANUARY”的對(duì)象是由Month
名為 的對(duì)象生成的JANUARY
。客體和客體是完全分開和不同的。Month
String
的文本String
只是Month
對(duì)象值的表示。
如果要通過該硬編碼實(shí)例名稱獲取常量,請(qǐng)調(diào)用valueOf
.
Month m = Month.valueOf( "JANUARY" ) ; // Returns a `Month` object, not text.
盡量不要養(yǎng)成習(xí)慣valueOf
。調(diào)用valueOf
破壞了 Java 中枚舉的目的和功能。您應(yīng)該傳遞枚舉對(duì)象,而不是它們的名稱字符串。
顯示名稱
這些全大寫的英文值可能足以用于日志記錄和調(diào)試。但我們不太可能希望全大寫英文文本出現(xiàn)在我們的用戶界面和報(bào)告中。因此,在編寫自己的代碼時(shí)Enum
,請(qǐng)?zhí)砑右粋€(gè)名為類似的方法getDisplayName
,如Month
&所示DayOfWeek
。指定TextStyle
縮寫的長度,以及Locale
翻譯中使用的人類語言和文化規(guī)范。
String output = m.getDisplayName( TextStyle.FULL , Locale.CANADA_FRENCH ) ;
揚(yáng)維爾
如何在您自己的枚舉上實(shí)現(xiàn)它?好吧,您的枚舉實(shí)際上是Enum
. 因此,您的枚舉實(shí)際上是一個(gè)與其他任何 Java 類一樣的 Java 類,因?yàn)樗梢跃哂袠?gòu)造函數(shù)和方法。為每個(gè)聲明的枚舉實(shí)例名稱添加參數(shù)。
示例類
這是單個(gè).java
文件中的完整示例枚舉類,帶有main
演示方法。
package work.basil.example;
import java.util.EnumSet;
import java.util.Set;
public enum Color {
BLACK( "Black" ), // Pass arguments to each declared constant instant name, as you are really calling the constructor on each `static` `final` class constant object being automatically instantiated.
GREY( "Grey" ),
RED( "Red" ),
GREEN( "Green" ),
BLUE( "Blue" );
private String displayName; // Store the display name as a member variable on each enum instance.
// Constructor
Color ( String displayName ) { // Define a constructor taking the display name argument you passed above.
this.displayName = displayName;
}
String getDisplayName ( ) {
return this.displayName;
}
public static void main ( String[] args ) {
System.out.println( "Color.BLACK.toString(): " + Color.BLACK.toString() );
System.out.println( "Color.BLACK.getDisplayName(): " + Color.BLACK.getDisplayName() );
Set < Color > monochromeColors = EnumSet.of( Color.BLACK , Color.GREY );
boolean isRedMonochrome = monochromeColors.contains( Color.RED ); // ? false.
System.out.println( "isRedMonochrome: " + isRedMonochrome );
}
}
跑的時(shí)候。
Color.BLACK.toString(): 黑色
Color.BLACK.getDisplayName():黑色
isRedMonochrome: 假
注意使用EnumSet(or EnumMap) 來收集枚舉實(shí)例。這里我們定義了一個(gè)以黑色和灰色命名的Color對(duì)象集合,但忽略了紅色、綠色和藍(lán)色。SetmonochromeColors
要使用您的枚舉,請(qǐng)想象一個(gè)Poster具有海報(bào)背景顏色的 setter 方法的類。
Poster poster = new Poster() ;
poster.setBackgroundColor( Color.GREEN ) ;
不需要文字 - 只需使用對(duì)象
請(qǐng)注意,沒有涉及文本。不需要實(shí)例名稱的字符串,也不需要顯示名稱。使用枚舉實(shí)例是關(guān)于使用對(duì)象,而不是文本,而不是String. 使用 enum 對(duì)象可確保值有效,提供類型安全性,并使您的代碼更具自我記錄性。
使用名稱
讓我們添加需要這些名稱的代碼。首先用于記錄,toString在Poster.
@Override public String toString() {
return "Poster{ name=" + this.name + " | backgroundColor: " + this.backgroundColor.toString() + " }" ; // Shows "GREEN"
}
在用戶界面中展示海報(bào)時(shí),顯示顏色的名稱。
Label label = new Label(
"Background color: " +
poster.getBackgroundColor().getDisplayName() // Shows "Green".
) ;
添加回答
舉報(bào)