很多初学者在刚开始使用枚举的时候觉得它只是一个给常量命名的工具,比如静态常量字符串ENUM_VAL_NAME。
但其实Java 语言(一种计算机语言,尤用于创建网站)语言(一种计算机语言,尤用于创建网站)的枚举还有很多先进的功能,这些功能可以帮助开发者写出更简洁且不易出错的代码。
接下来我会列举一些Java 语言(一种计算机语言,尤用于创建网站)语言(一种计算机语言,尤用于创建网站)的高级枚举功能,以及如何利用这些功能来使得开发更高效,更具可读性。
枚举是类
首先,我们要确认一点,枚举是Java 语言(一种计算机语言,尤用于创建网站)语言(一种计算机语言,尤用于创建网站)的一个类。
比如创建下面一段代码,枚举的基类枚举名称
公共抽象类枚举名称扩展了枚举名称
实现康斯特布尔,可比较,可序列化
私有最终字符串名称;
公共最终字符串名称(){ 0
返回名称;
}
私有最终(同Internationalorganizations)国际组织序数;
公共最终国际序数(){ 0
返回序数;
}
受保护的枚举(字符串名称,int序数){ 0
this.name=name
这个。序数=序数;
}
公共字符串ToString(){ 0
返回名称;
}
公共最终布尔等于(对象其他){ 0
返回此==其他;
}
public final int HashCode(){ 0
返回超级棒。hashcode();
}
公共最终内部比较
Enum?其他=(枚举?)o;
枚举自我=这个;
if (self.getClass()!=other.getClass() //优化
self.getDeclaringClass()!=other.getDeclaringClass())
抛出新的class castexception();
返回自我。序数其他。序数;
}
}
上述代码是一个普通的抽象类,有两个字段,名称和序数。
由于枚举都是类,所以我们能够为枚举提供实例方法、构造函数和字段,还可以重写toString()
Java中的Operation枚举
枚举操作{
添加,
减法,
多样地
}
此枚举表示可以对两个值操作并将产生结果。
一般来说,初学者更偏向于使用转换语句来完成这个功能,如下代码所示:
公共int apply(操作操作,int arg1,int arg 2){ 0
开关(操作){ 0
案例地址:
返回arg1 arg2
案例减法器:
返回arg 1arg 2;
多面板:
返回arg1 * arg2
默认值:
抛出新的UnsupportedOperationException();
}
}
这个实现存在一些问题。
如果我们向操作添加新操作,编译器不会通知此转换没有正确处理新的操作。
遇到系统默认值情况,就算我们知道它永远不会发生,这也是必需的。
但还好,Java 8使用函数式编程为我们提供了一个干净的解决方案。
功能枚举实现
由于枚举是类,我们可以创建一个枚举字段来保存函数。如何来完成这一操作?
首先,让我们将开关放在枚举类中。
枚举操作{
添加,
减法,
乘法;
公共静态int apply(操作操作,int arg1,int arg 2){ 0
开关(操作){ 0
案例地址:
返回arg1 arg2
案例减法器:
返回arg 1arg 2;
多面板:
返回arg1 * arg2
默认值:
抛出新的UnsupportedOperationException();
}
}
}
可以做这样的添加:操作。应用(操作. ADD,2,3);
上述代码中是从里面的调用方法操作,可以将其更改为实例方法,并使用这关键字,而不是将所需的操作作为参数传递。
public int apply(int arg1,int arg 2){ 0
切换(此){ 0
案例地址:
返回arg1 arg2
案例减法器:
返回arg 1arg 2;
多面板:
返回arg1 * arg2
默认值:
抛出新的UnsupportedOperationException();
}
}
像这样调用加法操作:操作。应用(2,3);
现在让我们更进一步,通过使用函数式编程完全消除转换语句。
枚举操作{
ADD((x,y) - x,y)、
减法((x,y)-xy),
乘法((x,y)-x * y);
运算(双功能整数、整数、整数运算){ 0
操作=操作
}
私有最终双功能整数、整数、整数运算;
public int apply(int x,int y){ 0
return operation.apply(x,y);
}
}
上述代码中做了三件事:
1.添加了一个双功能整数,整数,整数运算字段。
2.操作使用双功能参数创建了一个构造函数。
3.调用构造函数双功能整数,整数,整数并用
希腊字母的第11个指定。该
java.util.function.bifunction操作字段是对具有两个参数的函数(方法)的引用。在上面的代码示例中,两个参数都是整数,返回值也是整数。但是,Java参数化类型不支持原语,所以必须使用Integer。
新的操作实现以相同的方式使用:操作。应用(2,3),
但是,这种实现比switch好,因为编译器在Operation中添加新函数时会要求开发人员实现新函数。
关键要点
Java枚举是EnumT的扩展。
枚举可以有字段、构造函数和实例方法。
Java枚举字段可以存储与lambda结合使用的函数,或者创建一个干净且安全的特定于枚举的函数实现,并在编译时强制执行它(不使用switch)。
以上是枚举的高阶用法。希望对你有帮助。
上一篇:mac如何在硬盘中创建新文件夹_超详细mac新手教程
下一篇:没有了