枚举
枚举在JDK1.5之后添加,在1.5之前定义类似于枚举的过程是在类中定义私有的构造方法,在本类中自己实例化本身的构造方法添加一些属性,例如 颜色等等,并通过pubilc 来给私有的属性赋值,可以通过调用getInstance 方法来赋值 switch case 来限制属性的选择。
public static Color getInstance(int i) { switch (i) { case 1: return RED; break; case 2: return GREEN; case 3: return BLUE; break; } }
经过1.5之后就有了枚举的概念,通过关键字(enum)来声明为枚举类,自动实现了comparable 接口,使其变为有序的,且自动继承了Enum类,所以枚举类特点是:可以实现多个接口,不能再次继承。
public enum 类名
{
Video,music,txt
}
一般来说我们会在用这些属性的时候会进行备注,这样的代码可读性会比较低,所以通过一些方法来进行注释。
public enum Entity { Video("视频"),Music("音乐"),Txt("文本");//相当于实例化三个对象 private String value; // 定义“”类型名称 public String getValue() { return value; } public void setValue(String value) { this.value = value; } Entity(String value){ this.value=value; } }
值得注意的是Video("视频"),Music("音乐"),Txt("文本"),如果这下面有方法的话在这行后面一定加上分号,
此处的构造方法目的其实是Video("视频"),Music("音乐"),Txt("文本") 这三个实例化,值得注意的是这边的构造方法和普通类的构造方法不太一样,此处的构造方法只能由private修饰,而private修饰只能本类自己使用。这边通过set get 方法来改变名称。枚举类可以放抽象方法但是必须要在元素列表中声明。
因为自动继承了Enum类所以就可以使用Enum中的方法(Enum属于java.lang中的包),有些常用的方法
tostring(),显示枚举类元素。ordinal() 读取下标。values()返回的是枚举类型的数组,valueof() 返回枚举类型元素 里面放入枚
举类和枚举类里的内容 其方法就是将此内容提取出来,上代码
import java.util.EnumMap;
import java.util.EnumSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
public class Fileenum {
public static void main(String[] args) {
Entity entity=Entity.Music;// 提取枚举类里的信息music
entity.setValue("音乐人");
System.out.println(entity.name()+entity.getValue());
for(Entity b:entity.values()) {//values方法是将entity 转为entity[]数组
System.out.println(b+b.getValue()+b.ordinal());
}
/*
* Entity只是个类型 allof 是将Entity里的全复制到指定集合里
* 然后移除enu中的一项
* complementof 是将比较原enu里的 将现有的且缺少的放进enumset 集合里
* noneof 指定一个枚举类型的空集合
*/
EnumSet<Entity> enu=EnumSet.allOf(Entity.class);
enu.remove(entity);
EnumSet<Entity> en=EnumSet.complementOf(enu);
EnumSet<Entity> en1=EnumSet.noneOf(Entity.class);
/*
* 枚举里集合 EunmMap 是键值对集合 此处构造方法是构造了只能存放Entity类型的参数
* map里的所有功能都可以用
* 也可以遍历Map集合里的内容
*/
EnumMap<Entity, String> enummap=new EnumMap<>(Entity.class);
enummap.put(entity, "音乐");
enummap.put(Entity.Txt, "文本");
/*
* 遍历集合的过程
*/
Set<Map.Entry<Entity, String>> set=enummap.entrySet();
Iterator<Entry<Entity, String>> it=set.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
}
}
上述代码中涉及到了新的知识,在集合中有对枚举的支持EnumSet,EnumMap。
EnumSet 是set接口的子类,所以里面的内容不能重复。在Api中并没有关于构造方法的EnumSet的类需要使用本类的提供的静态方法。
EnumMap是Map接口的子类,Map里所有的方法都可以使用。