我想验证传递给setter的参数。
我有一个枚举,在这个枚举中,我有汽车颜色。
在设置器中,我想检查传入的参数是否是我的Color枚举的一部分。
我正在寻找任何枚举方法,但没有找到任何方法。我尝试使用正则表达式,但这不是一个好主意。
public enum Color {
BLUE, RED, BLACK, WHITE
}
public void setColor(String color) {
//hear should be a method checking if a color contain enum
this.color = color;
}
我希望这个元素将包含一个枚举。
答案 0 :(得分:0)
在设置器中,我想检查传入的参数是否是我的Color枚举的一部分。
方法错误。您应该传递一个对象,这是您的枚举对象之一,而不是颜色名称的文本。
请参见下面的poster.setBackgroundColor( Color.GREEN )
示例。
这是在Java中使用枚举的要点:如果在编译时让编译器检查(如果传递了有效值),则不必担心在运行时在代码中进行验证。< / p>
好像您正在混淆一些东西。您可能会混淆枚举实例(一个常量),其硬编码名称以及您可能希望在运行时向用户显示的名称。
Enum
是一种方便地实例化类的预定数量实例的方法,每个实例被分配一个预定名称。例如,Month
和Month.JANUARY
到Month.DECEMBER
。
如果您想要实例的硬编码名称(按照惯例,全部为大写形式,则为常量),则调用toString
。
String constantName = Month.JANUARY.toString() ;
一月
此处非常清楚:文本为“ JANUARY”的String
对象是由名为Month
的{{1}}对象生成的。 JANUARY
对象和Month
对象是完全独立和不同的。 String
的文本仅表示{{1}的值}对象。
如果要通过该硬编码实例名称获取常数,请调用String
。
Month
尝试不养成valueOf
的习惯。调用Month m = Month.valueOf( "JANUARY" ) ; // Returns a `Month` object, not text.
会破坏Java枚举的目的和功能。您应该传递枚举对象,而不是它们的名称字符串。
那些全大写的英语值可能足以记录和调试。但是我们不希望全大写英文文本出现在我们的用户界面和报告中。因此,在编写自己的valueOf
时,请添加一个名为getDisplayName
之类的方法,如valueOf
和DayOfWeek
所示。指定Enum
作为缩写的长度,Month
作为翻译中使用的人类语言和文化规范。
TextStyle
janvier
如何在您自己的枚举中实现它?好吧,您的枚举实际上是Enum
的子类。因此,您的枚举实际上是一个Java类,与其他任何枚举一样,它可以具有构造函数和方法。向每个声明的枚举实例名称添加参数。
这是单个Locale
文件中的完整示例枚举类,并带有String output = m.getDisplayName(
TextStyle.FULL ,
Locale.CANADA_FRENCH
) ;
的演示方法。
.java
运行时。
Color.BLACK.toString():黑色
Color.BLACK.getDisplayName():黑色
isRedMonochrome:错误
请注意使用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 );
}
}
)来收集枚举实例。在这里,我们在名为EnumSet
的{{1}}中为黑色和灰色定义了EnumMap
个对象的集合,但忽略了红色,绿色和蓝色。
要使用您的枚举,请想象一个Color
类,该类使用setter方法来设置海报的背景色。
Set
请注意,其中没有文字。不需要实例名称的字符串,也不需要显示名称。使用枚举实例是关于使用对象而不是文本,而不是monochromeColors
。使用枚举对象可确保有效值,提供type-safety,并使您的代码更具自记录性。
让我们添加需要这些名称的代码。首先记录日志,在Poster
上添加Poster poster = new Poster() ;
poster.setBackgroundColor( Color.GREEN ) ;
方法。
String
在用户界面中展示海报时,请显示颜色的名称。
toString