枚举类

枚举类不出来的时候只能如下写代码

 //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_枚举类的更多相关文章

  1. java_枚举类枚举值

    package ming; enum Gender{ MALE("男"),FEMALE("女"); //public static final Gender M ...

  2. java_包含抽象方法的枚举类

    package ming; enum Operation { PLUS { public double eval(double x, double y) { return x + y; } }, MI ...

  3. java_实现接口的枚举类

    package ming; interface GenderDoc { void info(); } enum Gender implements GenderDoc { // public stat ...

  4. Linq专题之提高编码效率—— 第三篇 你需要知道的枚举类

     众所周知,如果一个类可以被枚举,那么这个类必须要实现IEnumerable接口,而恰恰我们所有的linq都是一个继承自IEnumerable接口的匿名类, 那么问题就来了,IEnumerable使了 ...

  5. 0029 Java学习笔记-面向对象-枚举类

    可以创建几个对象? n多个:大部分的类,都可以随意创建对象,只要内存不爆掉 1个:比如单例类 有限的几个:采用单例类的设计思路,可以只允许创建少数的几个特定的对象:还有就是枚举类. 创建少数几个对象, ...

  6. FastJson转换自定义枚举类

    在项目中有些状态需要采用枚举类型,在数据库中保存的是name(英文),而前台需要显示的是text(中文). 所以这就需要自己去实现序列. 例如对象: import java.util.Date; im ...

  7. Java 枚举类

    如果要定义一个枚举类: public enum Size { SAMLL, MEDIUM, LARGE, EXTRA, EXTRA_LARGE}; 实际上,这个声明定义的类型是一个类,它刚好有4个实例 ...

  8. SpringMVC 自动封装枚举类的方法

    springmvc默认无法自动封装枚举类,解决方法如下: 1.枚举类 public enum GoodsPromoteEnum { /** * 0 精品 */ fine("精品", ...

  9. 枚举类valueOf方法的疑问

    枚举类中valueOf方法只有一个参数而Enum类中有两个参数,请问Enum实例类中的valueOf方法是从何处继承而来?   答案:jvm进行编译的时候添加的.

随机推荐

  1. hihocoder 1049 后序遍历树

    #include<cstdio> #include<cstdlib> #include<iostream> #include<cstring> #inc ...

  2. CodeForces - 688C:NP-Hard Problem (二分图&带权并查集)

    Recently, Pari and Arya did some research about NP-Hard problems and they found the minimum vertex c ...

  3. java-04类和对象课堂练习

    1.请运行并输入以下代码,得到什么结果 public class Test { public static void main(String[] args){ Foo obj1=new Foo(); ...

  4. SQL Server 学习系列之六

    SQL Server 学习系列之六 SQL Server 学习系列之一(薪酬方案+基础) SQL Server 学习系列之二(日期格式问题) SQL Server 学习系列之三(SQL 关键字) SQ ...

  5. jraiser模块加载执行简要总结

    1 在html文件中,通过require方式来加载指定的入口文件:2 然后通过正则表达式来匹配入口文件中的所有require的依赖文件:注意,此时入口文件已加载完毕,不过,还没执行而已.3 之后逐一通 ...

  6. Sentry入门

    指令类型: 创建.删除角色: CREATE ROLE sentry_all; droop role admin_role;   角色授权/撤销权限: 数据库级别角色授权 GRANT ALL ON DA ...

  7. 9.Selenium+HTMLTestRunner无法生成测试报告(Pycharm)

    1.若编辑器为Pycharm,代码无任何错误,且运行成功,但是无法生成测试报告,原因如下:(本质是编辑器原因) 若光标在如图位置,右键显示为“run 'unittest in XX'”,若是显示这种, ...

  8. Android高仿京东淘宝自动无限循环轮播控件的实现思路和过程

    在App的开发中,很多的时候都需要实现类似京东淘宝一样的自动无限轮播的广告栏,所以就自己写了一个,下面是我自定义控件的实现思路和过程. 一.自定义控件属性 新建自定义控件SliderLayout继承于 ...

  9. Activiti:MalformedByteSequenceException: 3 字节的 UTF-8 序列的字节 3 无效。

    在win下开发,有时编译或运行项目会报3字节的UTF-8序列的字节3无效. 解决该问题的办法 1.将xml头文件改为GBK编码方式 ,我这里不OK <?xml version="1.0 ...

  10. 操作Oracle 一条龙

    1 引用Oracle.DataAccess.dll 2 App.Config中配置连接字符串: Data Source=(DESCRIPTION = (ADDRESS = (PROTOCOL = TC ...