
在java开发中,有时我们希望定义一种特殊的类型,它只能表示有限的、预设的数值,例如仅限于-1和1。这种需求通常源于业务逻辑对特定状态或符号的严格限制。然而,java语言本身并不支持用户自定义原始数据类型,也不支持运算符重载。这意味着我们无法创建一个自定义类,使其实例能够像 int 类型一样直接参与 +、-、== 等算术或比较运算,例如 plusorminusone a = ...; int b = a + 1; 或 if (a == -1) 这样的写法在java中是无法实现的。
为了解决这一问题,并确保类型安全以及限制实例的创建,Java中的枚举(Enum)是实现此类“受限值类型”的最佳实践。枚举提供了一种机制,允许我们定义一个固定数量的命名常量,并确保除了这些预定义的常量之外,无法创建该类型的其他实例。
通过将整数值与每个枚举常量关联起来,我们可以创建一个既具有类型安全性又能够表达特定整数含义的自定义类型。以下是一个名为 Sign(相较于 PlusOrMinusOne 更具描述性)的枚举示例,它仅包含代表 +1 和 -1 的两个实例:
public enum Sign {
PLUS_ONE(+1),
MINUS_ONE(-1);
private final int value; // 私有字段,用于存储关联的整数值
/**
* 枚举的构造函数,用于初始化每个枚举常量关联的整数值。
* 枚举构造函数默认是私有的。
* @param value 与枚举常量关联的整数值
*/
Sign(int value) {
this.value = value;
}
/**
* 获取当前枚举常量所代表的整数值。
* @return 关联的整数值
*/
public int getValue() {
return value;
}
/**
* 根据给定的整数值获取对应的 Sign 枚举实例。
* 如果输入值不是 +1 或 -1,则抛出 IllegalArgumentException。
* @param value 待转换的整数值
* @return 对应的 Sign 枚举实例
* @throws IllegalArgumentException 如果输入值非法
*/
public static Sign of(int value) {
if (value == 1) {
return PLUS_ONE;
}
if (value == -1) {
return MINUS_ONE;
}
throw new IllegalArgumentException("Invalid value for Sign: " + value + ". Only +1 and -1 are allowed.");
}
/**
* 获取当前 Sign 枚举实例的相反符号。
* 例如,PLUS_ONE.neg() 返回 MINUS_ONE。
* @return 相反符号的 Sign 枚举实例
*/
public Sign neg() {
if (this == PLUS_ONE) {
return MINUS_ONE;
}
return PLUS_ONE; // 如果是 MINUS_ONE,则返回 PLUS_ONE
}
/**
* 重写 toString 方法,提供更友好的字符串表示。
* @return "+1" 或 "-1"
*/
@Override
public String toString() {
return this == PLUS_ONE ? "+1" : "-1";
}
}枚举常量定义 (PLUS_ONE(+1), MINUS_ONE(-1);):
私有字段 (private final int value;):
立即学习“Java免费学习笔记(深入)”;
构造函数 (Sign(int value)):
getValue() 方法:
of(int value) 静态工厂方法:
neg() 方法:
toString() 方法:
下面是如何在实际代码中使用 Sign 枚举的例子:
public class SignDemo {
public static void main(String[] args) {
// 获取枚举实例
Sign positiveSign = Sign.PLUS_ONE;
Sign negativeSign = Sign.MINUS_ONE;
System.out.println("Positive Sign: " + positiveSign); // 输出: +1
System.out.println("Negative Sign: " + negativeSign); // 输出: -1
// 获取底层整数值
int val1 = positiveSign.getValue(); // val1 = 1
int val2 = negativeSign.getValue(); // val2 = -1
System.out.println("Value of positiveSign: " + val1);
System.out.println("Value of negativeSign: " + val2);
// 使用 of() 方法从整数创建枚举实例
Sign signFromOne = Sign.of(1);
Sign signFromMinusOne = Sign.of(-1);
System.out.println("Sign from 1: " + signFromOne); // 输出: +1
System.out.println("Sign from -1: " + signFromMinusOne); // 输出: -1
// 尝试创建非法值 (会抛出 IllegalArgumentException)
try {
Sign invalidSign = Sign.of(0);
System.out.println("Invalid Sign: " + invalidSign);
} catch (IllegalArgumentException e) {
System.out.println("Error: " + e.getMessage()); // 输出: Error: Invalid value for Sign: 0. Only +1 and -1 are allowed.
}
// 使用 neg() 方法获取相反符号
Sign oppositeOfPlusOne = Sign.PLUS_ONE.neg();
Sign oppositeOfMinusOne = Sign.MINUS_ONE.neg();
System.out.println("Opposite of +1: " + oppositeOfPlusOne); // 输出: -1
System.out.println("Opposite of -1: " + oppositeOfMinusOne); // 输出: +1
// 枚举实例可以直接比较
if (positiveSign == Sign.PLUS_ONE) {
System.out.println("positiveSign is indeed PLUS_ONE.");
}
}
}通过上述方法,我们成功地在Java中创建了一个仅包含特定整数值(-1和1)的自定义类型。虽然它不能像原始整数类型那样直接参与所有算术运算,但通过提供清晰的方法(如 getValue()、of() 和 neg()),我们能够以类型安全且易于理解的方式操作这些受限值,从而满足了业务需求并提升了代码的健壮性。
以上就是在Java中创建仅包含特定整数值的自定义类型:Enum的最佳实践的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号