Java_枚举类
枚举类
枚举类不出来的时候只能如下写代码
//Student.java
package cn.itcast.enumeration; public class Student {
private String name;
private String grade;//A B C D E
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGrade() {
return grade;
}
public void setGrade(String grade) {
if(!grade.matches("[ABCDE]")){
throw new RuntimeException("成绩输入错误");
}
this.grade = grade;
}
}
第17行代码使用了正则表达式。
//Test.java
package cn.itcast.enumeration; public class Test { public static void main(String[] args) {
// TODO Auto-generated method stub
Student s = new Student();
s.setGrade("H");
}
}
这个代码有一点不好,就是给赋值了,但是程序运行是才报错。如何让写代码的时候就报错?看如下代码。
//Student.java
package cn.itcast.enumeration2; public class Student {
private String name;
private Grade grade;//A B C D E
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Grade getGrade() {
return grade;
}
public void setGrade(Grade grade) {
this.grade = grade;
}
} class Grade{
private Grade(){} public static Grade A = new Grade();
public static Grade B = new Grade();
public static Grade C = new Grade();
public static Grade D = new Grade();
public static Grade E = new Grade();
}
定义一个自己使用的类,再赋值的时候只能赋指定的值,其他值都报错。
//Test.java
package cn.itcast.enumeration2; public class Test { public static void main(String[] args) {
// TODO Auto-generated method stub
Student s = new Student();
s.setGrade(Grade.A);
}
}
这种方法太复杂,下面使用枚举,只要三行就能取代21-29行的代码
//Student.java
package cn.itcast.enumeration3; public class Student {
private String name;
private Grade grade;//A B C D E
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Grade getGrade() {
return grade;
}
public void setGrade(Grade grade) {
this.grade = grade;
}
}
/*
class Grade{
private Grade(){} public static Grade A = new Grade();
public static Grade B = new Grade();
public static Grade C = new Grade();
public static Grade D = new Grade();
public static Grade E = new Grade();
}
*/
enum Grade{//也是定义了一个类
A,B,C,D,E;//对应的是Grade类的对象
}
使用枚举类取代21-29行的代码。
package cn.itcast.enumeration3;
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Student s = new Student();
s.setGrade(Grade.A);
}
}
这种方法比较好,但是如何在枚举类里面封装更多的信息?看下面的代码
//Student.java
package cn.itcast.enumeration4; public class Student {
private String name;
private Grade grade;//A B C D E
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Grade getGrade() {
return grade;
}
public void setGrade(Grade grade) {
this.grade = grade;
}
}
/*
class Grade{
private Grade(){} public static Grade A = new Grade();
public static Grade B = new Grade();
public static Grade C = new Grade();
public static Grade D = new Grade();
public static Grade E = new Grade();
}
*/
//如何让枚举封装更多的信息(如何让枚举对象拥有自己的属性)
enum Grade{//也是定义了一个类
A("100-90"),B("89-80"),C("79-70"),D("69-60"),E("59-0");//对应的是Grade类的对象 private String value;
private Grade(String value){
this.value = value;
}
public String getValue(){
return value;
}
}
封装成绩的同时,可以封装分数段,增加属性。
//Test.java
package cn.itcast.enumeration4; public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Student s = new Student();
s.setGrade(Grade.A);
System.out.println(Grade.A.getValue());
}
}
那么如何在枚举类里面封装各自的方法呢?看下面的代码。
//Student.java
package cn.itcast.enumeration6; public class Student {
private String name;
private Grade grade;//A B C D E
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Grade getGrade() {
return grade;
}
public void setGrade(Grade grade) {
this.grade = grade;
}
}
/*
class Grade{
private Grade(){} public static Grade A = new Grade();
public static Grade B = new Grade();
public static Grade C = new Grade();
public static Grade D = new Grade();
public static Grade E = new Grade();
}
*/
//如何让枚举对象拥有自己的属性和各自的方法
enum Grade{//也是定义了一个类
A("100-90"){
public String toLocalString(){
return "优";
}
},B("89-80"){
public String toLocalString(){
return "良";
}
},C("79-70"){
public String toLocalString(){
return "中";
}
},D("69-60"){
public String toLocalString(){
return "一般";
}
},E("59-0"){
public String toLocalString(){
return "差";
}
};//对应的是Grade类的对象 private String value;
private Grade(String value){
this.value = value;
}
public String getValue(){
return value;
}
public abstract String toLocalString();
}
返回成绩的中文表示。
package cn.itcast.enumeration6;
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Student s = new Student();
s.setGrade(Grade.A);
System.out.println(Grade.A.getValue());
System.out.println(Grade.A.toLocalString());
}
}
注意:枚举类的对象的方法必须是私有的,不能公有。
枚举类有如下特性:
1.枚举类也是一种特殊的Java类。
2.枚举类中声明的每一个枚举值代表枚举类的一个实例对象。
3.与Java中的普通类一样,在声明枚举类时,也可以声明属性、方法和构造函数,但是枚举类的构造函数必须为室友的(这点不难理解)。
4.枚举类也可以实现接口、或基层抽象类。
5.JDK5中扩展了switch语句,它除了可以接收int、byte、char、short外,还可以接收一个枚举类型。
6.若枚举类只有一个枚举值,则可以当做单态设计模式。
下面这样写也是单态设计模式。
enum Demo{
demo;
}
枚举类的常用方法
public void test(){
//枚举类的常用方法name,valueOf,values
String name = "B";
Grade g = Grade.valueOf(name);//把字符串转成枚举对象
System.out.println(g.name());//获取枚举对象名称
Grade gs[] = Grade.values();
for(Grade g1:gs){
System.out.println(g1.name());
}
}
Java_枚举类的更多相关文章
- java_枚举类枚举值
package ming; enum Gender{ MALE("男"),FEMALE("女"); //public static final Gender M ...
- java_包含抽象方法的枚举类
package ming; enum Operation { PLUS { public double eval(double x, double y) { return x + y; } }, MI ...
- java_实现接口的枚举类
package ming; interface GenderDoc { void info(); } enum Gender implements GenderDoc { // public stat ...
- Linq专题之提高编码效率—— 第三篇 你需要知道的枚举类
众所周知,如果一个类可以被枚举,那么这个类必须要实现IEnumerable接口,而恰恰我们所有的linq都是一个继承自IEnumerable接口的匿名类, 那么问题就来了,IEnumerable使了 ...
- 0029 Java学习笔记-面向对象-枚举类
可以创建几个对象? n多个:大部分的类,都可以随意创建对象,只要内存不爆掉 1个:比如单例类 有限的几个:采用单例类的设计思路,可以只允许创建少数的几个特定的对象:还有就是枚举类. 创建少数几个对象, ...
- FastJson转换自定义枚举类
在项目中有些状态需要采用枚举类型,在数据库中保存的是name(英文),而前台需要显示的是text(中文). 所以这就需要自己去实现序列. 例如对象: import java.util.Date; im ...
- Java 枚举类
如果要定义一个枚举类: public enum Size { SAMLL, MEDIUM, LARGE, EXTRA, EXTRA_LARGE}; 实际上,这个声明定义的类型是一个类,它刚好有4个实例 ...
- SpringMVC 自动封装枚举类的方法
springmvc默认无法自动封装枚举类,解决方法如下: 1.枚举类 public enum GoodsPromoteEnum { /** * 0 精品 */ fine("精品", ...
- 枚举类valueOf方法的疑问
枚举类中valueOf方法只有一个参数而Enum类中有两个参数,请问Enum实例类中的valueOf方法是从何处继承而来? 答案:jvm进行编译的时候添加的.
随机推荐
- Mac安装SSHFS挂载远程服务器上的文件夹到本地
一.安装SSHFUS sshfs依赖于fuse,所以需要先安装fuse,这两个软件都可以在https://osxfuse.github.io/下载到. 注意安装顺序. 二.挂载文件夹到本地 输入一下命 ...
- 运动目标跟踪中kalman滤波器的使用
目标跟踪的kalman滤波器介绍 Kalman滤波器是通过前一状态预测当前状态,并使用当前观测状态进行校正,从而保证输出状态平稳变化,可有效抵抗观测误差.因此在运动目标跟踪中也被广泛使用.在视频处理的 ...
- sed----Linux下文本处理五大神器之一
转自:http://www.cnblogs.com/dong008259/archive/2011/12/07/2279897.html sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行 ...
- LeetCode Design Compressed String Iterator
原题链接在这里:https://leetcode.com/problems/design-compressed-string-iterator/description/ 题目: Design and ...
- MySQL 预处理语句prepare、execute、deallocate的使用
所以对于中文乱码,需要去check的地方有如下3个:1.mysql窗口的字符编码(xshell连接的远程工具的字符集设置):2.数据库的字符编码(show variables like '%char% ...
- apache配置详解 apache安装路径
http://www.linuxidc.com/Linux/2015-02/113921.htm 不同apache的安装方式 的安装目录示例 http://www.121down.com/articl ...
- hihoCoder#1095(二分搜索)
时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Little Hi and Little Ho are playing a drinking game called HI ...
- [转载]Linux内核list_head学习(二)
前一篇文章讨论了list_head 结构的基本结构和实现原理,本文主要介绍一下实例代码. 自己如果想在应用程序中使用list_head 的相应操作(当然应该没人使用了,C++ STL提供了list 用 ...
- Java: What is the difference between <init> and <clinit>?
Stack Overflow 上的一个问题:Java: What is the difference between <init> and <clinit>? JVM Sp ...
- DCloud-流应用:杂项
ylbtech-DCloud-流应用:杂项 1.返回顶部 2.返回顶部 3.返回顶部 4.返回顶部 5.返回顶部 6.返回顶部 7.返回顶部 8.返回顶部 9.返回 ...