枚举类里面能有构造器吗
时间: 2023-08-10 14:30:39 浏览: 96
枚举类可以有构造器,但需要注意以下几点:
1. 构造器必须是私有的:因为枚举类的常量值是固定的,不允许在运行时创建新的常量值,因此构造器只能在枚举类内部使用。
2. 构造器不能使用public或protected修饰符:因为枚举类的构造器只能在枚举类内部使用,而枚举类的常量值只能在枚举类外部使用,所以构造器不能使用public或protected修饰符。
3. 枚举常量值必须在枚举类的第一行列出,并以分号结尾:因为在枚举类加载时,枚举常量值会被创建,而构造器会被调用,因此必须保证枚举常量值在构造器之前被创建。
下面是一个带有构造器的枚举类的例子:
```
public enum Color {
RED("红色"), GREEN("绿色"), BLUE("蓝色");
private String name;
private Color(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
```
在上面的例子中,Color枚举类有一个私有的构造器,用于为每个枚举常量值设置名称。枚举常量值必须在第一行列出,并以分号结尾,每个枚举常量值都会调用构造器并设置名称。可以通过getName方法获取枚举常量值的名称。
相关问题
如果枚举类有构造器 枚举类valueOf方法
当枚举类包含构造器时,它的`valueOf()`方法是一个静态方法,用于根据给定的字符串常量名称找到相应的枚举实例。这个方法的作用类似于普通类型的`Class.forName()`和`newInstance()`组合。如果你的枚举类`MyEnum`有一个自定义构造器,比如:
```java
public enum MyEnum {
INSTANCE_ONE("One", true),
INSTANCE_TWO("Two", false);
private String name;
private boolean flag;
// 构造器
MyEnum(String name, boolean flag) {
this.name = name;
this.flag = flag;
}
public static MyEnum fromString(String valueName) {
try {
return valueOf(valueName.toUpperCase()); // 将输入转为大写处理,防止因大小写差异导致的查找失败
} catch (IllegalArgumentException e) {
throw new IllegalArgumentException("Invalid value for " + MyEnum.class.getName(), e);
}
}
}
```
在这个例子中,你可以通过`MyEnum.fromString("One")`获取到`INSTANCE_ONE`实例,因为`fromString`方法尝试调用枚举类型的`valueOf`方法。如果传入的字符串与枚举值匹配,就会返回对应的枚举实例;如果不匹配,则会抛出异常。
枚举类不能用@NotBlank吗
`@NotBlank` 是用于验证字符串类型的注解,而枚举类型不是字符串类型,因此不能直接使用 `@NotBlank` 进行验证。但是,你可以使用其他适合枚举类型的验证注解,例如 `@NotNull` 或 `@EnumValue`。`@NotNull` 用于验证枚举对象不为 null,而 `@EnumValue` 则用于验证枚举对象的值是否在指定的枚举范围内。
阅读全文