检查设置器中是否有Enum是所需元素之一

时间:2019-01-12 19:38:10

标签: java enums setter

我想验证传递给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;
}

我希望这个元素将包含一个枚举。

1 个答案:

答案 0 :(得分:0)

tl; dr

  

在设置器中,我想检查传入的参数是否是我的Color枚举的一部分。

方法错误。您应该传递一个对象,这是您的枚举对象之一,而不是颜色名称的文本。

请参见下面的poster.setBackgroundColor( Color.GREEN )示例。

这是在Java中使用枚举的要点:如果在编译时让编译器检查(如果传递了有效值),则不必担心在运行时在代码中进行验证。< / p>

详细信息

好像您正在混淆一些东西。您可能会混淆枚举实例(一个常量),其硬编码名称以及您可能希望在运行时向用户显示的名称。

Enum是一种方便地实例化类的预定数量实例的方法,每个实例被分配一个预定名称。例如,MonthMonth.JANUARYMonth.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之类的方法,如valueOfDayOfWeek所示。指定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