好记性不如铅笔头

java, think_in_java, 编程

《Java编程思想》读书笔记:enum

前一阵子在学习【 单例模式 】的时候看到了enum实现单例的方法。就趁此机会复习下<Think In Java>中的enum的各种使用方式。

github:

https://github.com/cstriker1407/think_in_java 】

CONTENTS

SimpleEnums:

最简单的enum的代码如下。

public enum SimpleEnums{
	Enum1,
	Enum2,
}

 EnumsWithFunc:

enum在java中可以被认为是一个类,因此可以有成员变量和函数。就是因为这个特性,enum可以作为单例的一种实现方式。

public enum EnumsWithFunc{
	XiaoMing(10,"yinianji"),/* 实例必须是第一个 */
	ZhangSan(12,"ernianji");/* 最后一个实例后面的是‘;’ */

	private int age;
	private String des;
	private EnumsWithFunc(int age, String des)/* 构造方法的标识符为private */
	{
		this.age = age;
		this.des = des;
	}
	public String showInfo()
	{
		return "Age:" + age + "  " + des;
	}
}

 EnumInter:

enum实现了interface,这样可以再外部的调用中将参数设置为接口了,但是老感觉这样怪怪的。

public interface EnumInter
{
	public String getInfo();
	enum Phone implements EnumInter 
	{
		HW("dalu"),SAMSUNG("waiguo");

		private String info;
		private Phone(String info)
		{
			this.info = info;
		}
		@Override
		public String getInfo()
		{
			return info;
		}
	}
	enum PC implements EnumInter
	{
		IBM("I"),APPLE("A");
		private String info;
		private PC(String info)
		{
			this.info = info;
		}
		@Override
		public String getInfo()
		{
			return info;
		}
	}
}

 调用方法:

private static void testfun_EnumWithInterfaces(EnumInter interfaces){
	System.out.println(interfaces.getInfo());
}

EnumsWith2Interfaces:

双层enum的interface实现。

public enum EnumsWith2Interfaces
{
	Phone(InterfaceEnum.Phone.class),
	PC(InterfaceEnum.PC.class);

	private InterfaceEnum [] values;
	private EnumsWith2Interfaces(Class<? extends InterfaceEnum> kind)
	{
		this.values = kind.getEnumConstants();
	}

	public InterfaceEnum[] getValues()
	{
		return values;
	}

	public interface InterfaceEnum
	{
		public String getInfo();
		enum Phone implements InterfaceEnum 
		{
			HW("dalu"),SAMSUNG("waiguo");

			private String info;
			private Phone(String info)
			{
				this.info = info;
			}
			@Override
			public String getInfo()
			{
				return info;
			}
		}
		enum PC implements InterfaceEnum
		{
			IBM("I"),APPLE("A");
			private String info;
			private PC(String info)
			{
				this.info = info;
			}
			@Override
			public String getInfo()
			{
				return info;
			}
		}
	}
}

AbstractEnum:

enum实际上是一个类,在enum里面加入抽象方法,每个实例去实现。

public enum AbstractEnum{
	test
	{
		@Override
		public void Func()
		{
			System.out.println("func in enum");
		}

	};

	public abstract void Func();

}

AnotherEnum:

另外一种比较奇怪的enum的实现方式,参考网址见注释。
/* http://blog.csdn.net/chinakite/article/details/3237204 */
public class AnotherEnum
{
	public static final AnotherEnum enum1 = new AnotherEnum(1);
	public static final AnotherEnum enum2 = new AnotherEnum(2);
	public static final AnotherEnum enum3 = new AnotherEnum(3);

	private int i;
	private AnotherEnum(int i)
	{
		this.i = i;
	}
}

 DistinctEnum:

如果不想让enum的值连续怎么办,一种很奇怪的写法。

public enum DistinctEnum{
	First(1),
	Second(2),
	Fifth(5);
	public static final HashMap<Integer, DistinctEnum> map = new HashMap<Integer, DistinctEnum>();
	static
	{
		for (DistinctEnum item : DistinctEnum.values())
		{
			map.put(item.i, item);
		}
	}

	private int i;
	private DistinctEnum(int i)
	{
		this.i = i;
	};
	public int getInt()
	{
		return i;
	}

}

 调用方法:

DistinctEnum testDistinctEnum = DistinctEnum.Fifth;
System.out.println(testDistinctEnum.getInt());
DistinctEnum lookupEnum = DistinctEnum.map.get(1);
System.out.println(lookupEnum.getInt());

更新:

2013年10月19日15:33:52

增加一个比较有趣的枚举向下移动的思路,通过这个思路可以实现很多有意思的功能。

	private static enum SpeedSelEnum
	{
		MIN("MIN"),
		MAX("MAX"),
		AVG("AVG"),
		CUR("CUR");
		private String speedDes;
		private SpeedSelEnum(String speedDes)
		{
			this.speedDes = speedDes;
		}
		public String getSpeedDes() {
			return speedDes;
		}
		
		public SpeedSelEnum getNext()
		{
			int len = SpeedSelEnum.values().length;
			int newIdx = (this.ordinal() + 1) % len;
			return SpeedSelEnum.values()[newIdx];
		}
		
	}

 

发表评论

4 × 5 =

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据