初学Java,枚举类(二十二)

Java的枚举类比C#枚举类更像类一点,因为它还可以定义属性和方法

public enum Gender 
{
	MALE,FEMALE;
	private String name;
	public void setName(String name)
	{
		switch(this)
		{
			case MALE:
				if(name.equals("男"))
				{
				    this.name = name;
			    }
				else
			    {
					System.out.println("参数错误");
					return;
				}
			break;
			case FEMALE:
				if(name.equals("女"))
				{
				    this.name = name;
			    }
				else
			    {
					System.out.println("参数错误");
					return;
				}
			break;
		}
	}
	public String getName()
	{
		return this.name;
	}
}
public class TestGender 
{
	public static void main(String[] args) 
	{
		Gender g = Enum.valueOf(Gender.class,"FEMALE");
		g.setName("女");
		System.out.println(g + "代表:" + g.getName());
		//此时设置 name 属性时将会提示参数错误码
		g.setName("男");
		System.out.println(g + "代表:" + g.getName());
	}
}

对枚举类来说,应该设计成不可变类,因此上面的属性值不应该允许改变,这样是不安全的,因此对属性应使用final修饰符,必须在构造器里为这些属性指定初始值,因此应该为枚举类显式定义带参数的构造器MALE,FEMALE 这些枚举值代表枚举类的所有可能实例,所以MALE(参数),就等同于调用构造器,类实例(参数)
MALE("男"),FEMALE("女")这样的写法确实给人一种怪异的感觉
public enum Gender 
{
	//此处的枚举值必须调用对应构造器来创建
	MALE("男"),FEMALE("女");
	private final String name;
	//枚举类的构造器只能使用private修饰
	private Gender(String name)
	{
		this.name = name;
	}
	public String getName()
	{
		return this.name;
	}
}

public class TestGender 
{
	public static void main(String[] args) 
	{
		Gender g = Enum.valueOf(Gender.class,"FEMALE");
		System.out.println(g + "代表:" + g.getName());

		g = Enum.valueOf(Gender.class,"MALE");
		System.out.println(g + "代表:" + g.getName());
	}
}
现在客户端不再有修改枚举类属性的权力了,呵呵
枚举类还可以实现一个或多个接口,C#的枚举类不支持这种做法
public interface GenderDesc 
{
	void info();
}


public enum Gender implements GenderDesc 
{
	//此处的枚举值必须调用对应构造器来创建
	MALE("男")
	//花括号部分实际上是一个类体部分
	{
		public void info()
		{
			System.out.println("这个枚举值代表男性");
		}
	},
	FEMALE("女")
	{
		public void info()
		{
			System.out.println("这个枚举值代表女性");
		}
	};
	private final String name;
	private Gender(String name)
	{
		this.name = name;
	}
}

当创建MALE和FEMALE两个枚举值时,后面又跟着一对花括号,括号里又包含一个info方法定义.括号部分实际是一个类体部分,当创始MALE,FEMALE枚举值时,并不是直接创建了Gender枚举类实例,而是相当于创建Gender的匿名子类实例.所以这个部分与匿名内部类语法大致相似.
编译生成三个文件Gender.class,Gender$1.class,Gender$2.class,和之前内部类的生成名字结构一样,证明了以上结论,MALE和FEMALE是Gender匿名子类的实例,而不是Gender类的实例
枚举类可包含抽象方法,当然这个C#也是不支持的
public enum Operation 
{
	PLUS
	{
		public double eval(double x,double y)
		{
			return x + y;
		}
	},
	MINUS
	{
		public double eval(double x,double y)
		{
			return x - y;
		}
	},
    TIMES
	{
		public double eval(double x,double y)
		{
			return x*y;
		}
	},
	DIVIDE
	{
		public double eval(double x,double y)
		{
			return x/y;
		}
	};
	//为枚举类定义一个抽象方法,这个抽象方法由不同枚举值提供不同的实现
	public abstract double eval(double x,double y);
	public static void main(String[] args) 
	{
		System.out.println(Operation.PLUS.eval(3,4));
		System.out.println(Operation.MINUS.eval(5,4));
		System.out.println(Operation.TIMES.eval(5,4));
		System.out.println(Operation.DIVIDE.eval(5,4));
	}
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值