Enum的使用很方便,之前想写一篇一直拖到现在,话不多说直接上代码
先贴全篇,可以直接down下来跑,全篇后是详解
package com.example.demo.st.setEnum;
import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;
/**
* Personnel class
*
* @author TransientBa
* @date 2018/2/28
*/
public enum Personnel {
小明("男",21,86),
小红("女",22,55){
@Override
public boolean isPass(){
return false;
}
},
小蓝("男",23,73);
private String sex;
private int age;
private int result;
/* 构造 */
private Personnel(String sex,int age,int result){
this.sex = sex;
this.age = age;
this.result = result;
}
@Override
public String toString() {
return this.name()+" 性别:"+this.getSex() + " 年龄:"+this.getAge()+" 成绩为:"+this.getResult();
}
/**
* 调出简介
*
* @return
*/
public String callResume(){
Personnel personnel = this;
switch (personnel){
case 小明:
System.out.println(this.name()+"的简介为:");
System.out.println(this.toString());
System.out.println("是否通过了考试: "+this.isPass());
break;
case 小红:
System.out.println(this.name()+"的简介为:");
System.out.println(this.toString());
System.out.println("是否通过了考试: "+this.isPass());
break;
default:
System.out.println(this.name()+"的简介为:");
System.out.println(this.toString());
System.out.println("是否通过了考试: "+this.isPass());
break;
}
System.out.println("--- --- --- --- --- --- ---");
return "";
}
/**
* 比较成绩
* @param otherPersonnel
* @return
*/
public String compareResult(Personnel otherPersonnel){
int pr1 = this.getResult();
int pr2 = otherPersonnel.getResult();
String pn1 = this.name();
String pn2 = otherPersonnel.name();
return pr1 > pr2 ? pn1+"比"+pn2+"高"+(pr1-pr2)+"分":(pr1 < pr2 ? pn1+"比"+pn2+"低"+(pr2-pr1)+"分":pn1+"与"+pn2+"成绩相同");
}
public String compareStudentNumber(Personnel personnel){
String pn1 = this.name();
String pn2 = personnel.name();
String tipStuNumber = "";
//compareTo返回负整数(小于) 零(登录) 正整数(大于) 由 pn1.ordinal - pn2.ordinal产生
if(this.compareTo(personnel) >0){
tipStuNumber = pn1+"的学号在"+pn2+"之后";
}else if(this.compareTo(personnel) < 0){
tipStuNumber = pn1+"的学号在"+pn2+"之前";
}else {
tipStuNumber = "两个人的学号相同";
}
return pn1+"的学号为:"+((int)this.ordinal()+1)+" "+pn2+"的学号为:"+((int)personnel.ordinal()+1)+"\n"+tipStuNumber;
}
public static void main(String[] args) {
// for(Personnel personnel:Personnel.values()){
// System.out.println(personnel.name()+"的简介为:");
// System.out.println(personnel.toString());
// System.out.println("是否通过了考试:" + personnel.isPass());
// System.out.println("----------------------");
// }
Personnel.小明.callResume();
System.out.println(Personnel.小红.compareResult(Personnel.小明));
System.out.println(Personnel.小明.compareStudentNumber(Personnel.小蓝));
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public boolean isPass(){
return true;
}
public int getResult() {
return result;
}
public void setResult(int result) {
this.result = result;
}
}
public enum Personnel {
小明,小红,小蓝;
}
//扩展一下
public enum Personnel {
小明("男",21,86),
小红("女",22,55),
小蓝("男",23,73);
private String sex;
private int age;
private int result;
}
//在扩展一下 重写小红的isPass方法 重写下toString 并带上构造 getset不贴了
public enum Personnel {
小明("男",21,86),
小红("女",22,55){
@Override
public boolean isPass(){
return false;
}
},
小蓝("男",23,73);
private String sex;
private int age;
private int result;
/* 构造 */
private Personnel(String sex,int age,int result){
this.sex = sex;
this.age = age;
this.result = result;
}
@Override
public String toString() {
return this.name()+" 性别:"+this.getSex() + " 年龄:"+this.getAge()+" 成绩为:"+this.getResult();
}
}
ordinal :
返回所在位置 例如 Personnel.小明 .ordinal();
compareTo :
比较两个enum定义时的位置 返回值为this.ordinal - other.ordinal
public String compareStudentNumber(Personnel personnel){
String pn1 = this.name();
String pn2 = personnel.name();
String tipStuNumber = "";
//compareTo返回负整数(小于) 零(登录) 正整数(大于) 由 pn1.ordinal - pn2.ordinal产生
if(this.compareTo(personnel) >0){
tipStuNumber = pn1+"的学号在"+pn2+"之后";
}else if(this.compareTo(personnel) < 0){
tipStuNumber = pn1+"的学号在"+pn2+"之前";
}else {
tipStuNumber = "两个人的学号相同";
}
return pn1+"的学号为:"+((int)this.ordinal()+1)+" "+pn2+"的学号为:"+((int)personnel.ordinal()+1)+"\n"+tipStuNumber;
}
1.8中源码为
public final int compareTo(E o) {
Enum> other = (Enum>)o;
Enum self = this;
if (self.getClass() != other.getClass() && // optimization
self.getDeclaringClass() != other.getDeclaringClass())
throw new ClassCastException();
return self.ordinal - other.ordinal;
}
Class getDeclaringClass()
返回与此枚举常量的枚举类型相对应的 Class 对象。
以上面的代码为例
System.out.println(Personnel.小明.getDeclaringClass());
返回值为
name返回当前定义的枚举名
values返回所有的枚举值
for(Personnel personnel:Personnel.values()){
System.out.println(personnel.name()+"的简介为:");
System.out.println(personnel.toString());
System.out.println("是否通过了考试:" + personnel.isPass());
System.out.println("----------------------");
}
结果为:
说句题外话,注意全篇中的compareResult方法与compareStudentNumber方法,在compareResult返回的三元中,并不等同于compareStudentNumber中的if else 实际等同如下
pr1 > pr2 ? pn1+"比"+pn2+"高"+(pr1-pr2)+"分":(pr1 < pr2 ? pn1+"比"+pn2+"低"+(pr2-pr1)+"分":pn1+"与"+pn2+"成绩相同");
等价于
if(pr1 > pr2){
//....
}else{
if(pr1 < pr2){
//...
}else{
//...
}
}
区别在于并不并列
if(){
//...
}else if(){
//...
}else{
//...
}
enum也同其他一样可理解为一个类,不同的为enum不能使用extends继承其他类。