1 回答

TA貢獻1874條經驗 獲得超12個贊
tl;博士
在設置器中,我想檢查傳入的參數是否是我的 Color 枚舉的一部分。
錯誤的做法。您應該傳遞一個 object,您的枚舉對象之一,而不是顏色名稱的文本。
請參見poster.setBackgroundColor( Color.GREEN )
下面的示例。
這就是在 Java 中使用枚舉的要點:讓編譯器在編譯時檢查是否傳遞了有效值,而不是擔心在運行時驗證代碼。
細節
看起來你在混淆一些東西。您可能混淆了枚舉實例(一個常量)、它的硬編碼名稱以及您可能希望在運行時向用戶顯示的名稱。
AnEnum
是一種方便地實例化預定數量的類實例的方法,每個實例都被分配一個預定的名稱。例如,Month
,Month.JANUARY
通過Month.DECEMBER
。
常數名稱
如果您想要實例的硬編碼名稱,按照約定全部大寫(作為常量),然后調用toString
.
String constantName = Month.JANUARY.toString() ;
一月
這里要非常清楚:String
帶有文本“JANUARY”的對象是由Month
名為 的對象生成的JANUARY
。客體和客體是完全分開和不同的。Month
String
的文本String
只是Month
對象值的表示。
如果要通過該硬編碼實例名稱獲取常量,請調用valueOf
.
Month m = Month.valueOf( "JANUARY" ) ; // Returns a `Month` object, not text.
盡量不要養成習慣valueOf
。調用valueOf
破壞了 Java 中枚舉的目的和功能。您應該傳遞枚舉對象,而不是它們的名稱字符串。
顯示名稱
這些全大寫的英文值可能足以用于日志記錄和調試。但我們不太可能希望全大寫英文文本出現在我們的用戶界面和報告中。因此,在編寫自己的代碼時Enum
,請添加一個名為類似的方法getDisplayName
,如Month
&所示DayOfWeek
。指定TextStyle
縮寫的長度,以及Locale
翻譯中使用的人類語言和文化規范。
String output = m.getDisplayName( TextStyle.FULL , Locale.CANADA_FRENCH ) ;
揚維爾
如何在您自己的枚舉上實現它?好吧,您的枚舉實際上是Enum
. 因此,您的枚舉實際上是一個與其他任何 Java 類一樣的 Java 類,因為它可以具有構造函數和方法。為每個聲明的枚舉實例名稱添加參數。
示例類
這是單個.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 );
}
}
跑的時候。
Color.BLACK.toString(): 黑色
Color.BLACK.getDisplayName():黑色
isRedMonochrome: 假
注意使用EnumSet(or EnumMap) 來收集枚舉實例。這里我們定義了一個以黑色和灰色命名的Color對象集合,但忽略了紅色、綠色和藍色。SetmonochromeColors
要使用您的枚舉,請想象一個Poster具有海報背景顏色的 setter 方法的類。
Poster poster = new Poster() ;
poster.setBackgroundColor( Color.GREEN ) ;
不需要文字 - 只需使用對象
請注意,沒有涉及文本。不需要實例名稱的字符串,也不需要顯示名稱。使用枚舉實例是關于使用對象,而不是文本,而不是String. 使用 enum 對象可確保值有效,提供類型安全性,并使您的代碼更具自我記錄性。
使用名稱
讓我們添加需要這些名稱的代碼。首先用于記錄,toString在Poster.
@Override public String toString() {
return "Poster{ name=" + this.name + " | backgroundColor: " + this.backgroundColor.toString() + " }" ; // Shows "GREEN"
}
在用戶界面中展示海報時,顯示顏色的名稱。
Label label = new Label(
"Background color: " +
poster.getBackgroundColor().getDisplayName() // Shows "Green".
) ;
添加回答
舉報