java拾遗录(一)
以前学java的时候经常关注一些基本知识,没有涉及到实际应用上,这几天去公司实习。发现一个以前经常听说但是重来没有亲自用过的一个东西:枚举类(Enum)
相比如常量来表示某些值,使用枚举类可以很好的体现可读性、安全性等特点。
在java中可以在工程中右键来新建一个自己的Enum类,他继承了java.lang.Enum类,实现Serializable 和 Comparable 接口
构造器是private修饰,该类的所有实例必须在第一行显示的列出来。
在该类中包含values()方法可以返回这个枚举类中包含的所有实例。同时可以用valueof(class,name)来创建一个已有的枚举类实例
枚举类最大的特点是希望他不被外接改变(大概是这种感觉吧)
e.g:enum
1 public enum Gender { 2 MALE("男"),FEMALE("女"); 3 private String name; 4 5 Gender(String name){ 6 this.name = name; 7 } 8 9 public String getName(){ 10 return name; 11 } 12 }
public class EnumTest { public static void main(String[] args) { Gender g = Enum.valueOf(Gender.class, "FEMALE"); //得到相应的enum实例 System.out.println(g + " represent : " + g.getName()); } }
输出结果:FEMALE represent : 女
和类相似的,枚举类也可以实现接口
1 public interface GenderDesc { 2 public void getInfo(); 3 }
gender实现接口并且给出接口中方法的具体实现:
public enum Gender implements GenderDesc{ MALE("男"),FEMALE("女"); private String name; Gender(String name){ this.name = name; } public String getName(){ return name; } @Override public void getInfo() { System.out.println("interface test !!"); } }
EnumTest中实现:
public class EnumTest { public static void main(String[] args) { Gender g = Enum.valueOf(Gender.class, "FEMALE"); System.out.println(g + " represent : " + g.getName()); g.getInfo(); } }
结果:
FEMALE represent : 女
interface test !!
在实现接口的时候也可以针对不同的对象实现不同的方法:
public enum Gender implements GenderDesc{ MALE("男"){ public void getInfo(){ System.out.println(" it's a man !"); } },FEMALE("女"){ public void getInfo(){ System.out.println("it's a woman"); } }; private String name; Gender(String name){ this.name = name; } public String getName(){ return name; } }
1 public class EnumTest { 2 public static void main(String[] args) { 3 Gender g = Enum.valueOf(Gender.class, "FEMALE"); 4 System.out.println(g + " represent : " + g.getName()); 5 g.getInfo(); 6 7 Gender g2 = Enum.valueOf(Gender.class, "MALE"); 8 System.out.println(g2 + " represent : " + g2.getName()); 9 g2.getInfo(); 10 11 } 12 13 }
结果:
FEMALE represent : 女
it's a woman
MALE represent : 男
it's a man !
在上面的程序中,当创建MALE,FEMALE的枚举类时并不是直接创建Gender类,而是创建他的匿名子类,从编译产生的class文件可以看出来。