Java枚举:覆写toString,再看equals、hashCode

来源:互联网 发布:程序员的数学 epub 编辑:程序博客网 时间:2024/05/21 16:56


仍然采用 Java 枚举:理解枚举本质 例子。稍加修改。


[java] 
package mark.demo; 
 
public class EnumDemo { 
 
    public static void main(String[] args) { 
        for (Color color : Color.values()) { 
            System.out.println(color); 
        } 
    } 
 
    public enum Color { 
        RED("red color", 0), GREEN("green color", 1), BLUE("blue color", 2), YELLOW( 
                "yellow color", 3); 
 
        Color(String name, int id) { 
            _name = name; 
            _id = id; 
        } 
 
        private String _name; 
        private int _id; 
 
        public String getName() { 
            return _name; 
        } 
 
        public int getId() { 
            return _id; 
        } 
    } 
 

打印结果

 


原本以为会打印如下形式的东西

 

 

但是,实际情况不是这样。具体可以查看 Enum 的源码,看看 toString 方法:


[java] 
/**
  * Returns the name of this enum constant, as contained in the
  * declaration.  This method may be overridden, though it typically
  * isn't necessary or desirable.  An enum type should override this
  * method when a more "programmer-friendly" string form exists.
  *
  * @return the name of this enum constant
  */ 
 public String toString() { 
turn name; 
 } 

注释写的很明白,返回的是 the name of enum constant(枚举常量值的名字)。


如果我们想要得到如期的结果,需要重写 toString 方法。


[java] 
package mark.demo; 
 
public class EnumDemo { 
 
    public static void main(String[] args) { 
        for (Color color : Color.values()) { 
            System.out.println(color); 
        } 
    } 
 
    public enum Color { 
        RED("red color", 0), GREEN("green color", 1), BLUE("blue color", 2), YELLOW( 
                "yellow color", 3); 
 
        Color(String name, int id) { 
            _name = name; 
            _id = id; 
        } 
 
        private String _name; 
        private int _id; 
 
        public String getName() { 
            return _name; 
        } 
 
        public int getId() { 
            return _id; 
        } 
         
        @Override 
        public String toString() { 
            return _name + "," + _id; 
        } 
    } 

上面代码里面使用增强 for 循环调用 values() 方法,遍历枚举的值,也可以这样来遍历:

[java] 
for (Color color : Color.values()) { 
    System.out.println(color.getName() + "," + color.getId()); 

 


Enum 类的 equals、hashCode 方法


[java] 
/**
    * Returns true if the specified object is equal to this
    * enum constant.
    *
    * @param other the object to be compared for equality with this object.
    * @return  true if the specified object is equal to this
    *          enum constant.
    */ 
   public final boolean equals(Object other) {  
       return this==other; 
   } 
 
   /**
    * Returns a hash code for this enum constant.
    *
    * @return a hash code for this enum constant.
    */ 
   public final int hashCode() { 
       return super.hashCode(); 
   } 

都是 final 的,很明显,设计者不想让子类去重写这两个方法。


的确,在枚举里面无法重写这两个方法。但是如何使用这个方法呢?

现在,我们不去重写 toString 方法,看看 equals 效果。


[java] 
public enum Color { 
        RED("red color", 0), GREEN("green color", 1),  
        BLUE("blue color", 2), YELLOW("yellow color", 3); 
 
        Color(String name, int id) { 
            _name = name; 
            _id = id; 
        } 
 
        private String _name; 
        private int _id; 
 
        public String getName() { 
            return _name; 
        } 
 
        public int getId() { 
            return _id; 
        } 


测试结果:

[java] 
public static void main(String[] args) { 
        System.out.println(Color.RED.equals(""));// false 
        System.out.println(Color.RED.equals("red color"));// false 
        System.out.println(Color.RED.equals("RED"));// false 
        System.out.println(Color.RED.equals(Color.BLUE));// false 
        // 同一个对象 
        System.out.println(Color.RED.equals(Color.RED));// true 
        // 实际是两个 String 
        System.out.println(Color.RED.toString().equals("RED"));// true 
        // 实际是两个 String 
        System.out.println(Color.RED.getName().equals("red color"));// true 
        // hashCode 
        System.out.println("Color.RED.hashCode = " + Color.RED.hashCode()); 

如果重写了类似上面的 toString 方法,那么

[java] view plaincopyprint?
System.out.println(Color.RED.toString().equals("RED")); 


返回的可能是 true,也可能是 false,这取决于你的 toString 具体实现。
 
如下面这种实现方法:返回 _name 的大写形式。


[java]
@Override 
        public String toString() { 
            return this._name.toUpperCase(); 
        } 


综上,建议根据需要可以重写 toString 方法,善用 equals 方法。

转载自:http://www.2cto.com/kf/201209/153314.htm
l

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 客人吃饭跑单了怎么办 脑子总是记不住东西怎么办 穿的鞋有味道怎么办 生完孩子血糖高怎么办 生了孩子子宫大怎么办 生完孩子阴吹怎么办 怀孕初期感冒嗓子发炎怎么办 脑子转不过来弯怎么办 他说我道行不深怎么办 鞋子内测磨破了怎么办 老公拉肚子拉的很厉害怎么办 老公拉肚子拉得很厉害怎么办 和老公吵架很厉害怎么办 新鞋鞋底吱吱响怎么办 新鞋鞋底滑了怎么办 工作中同事不配合怎么办 做体力活一身疼怎么办 大脑左则中动脉血管狭窄?怎么办 儿童体质差免疫力差怎么办 nba篮球大师体力不够怎么办 一千米差10秒怎么办 四十岁以后体力和耐力差怎么办 打篮球一打比赛就紧张怎么办 耐克空军鞋鞋底边胶掉了怎么办 鞋底踩到老鼠胶怎么办 头蒙怎么办最快最有效 备孕老公压力大怎么办 宝宝太兴奋不睡怎么办 我很烦只睡三小时觉怎么办才好 柯基精力太旺盛怎么办 孩子学习熬夜精力不足怎么办 肺癌晚期吃不下饭怎么办 这俩天吃药太多肝肾功能不好怎么办 跑步跑得头疼晕怎么办 吃完辣的想吐怎么办 体育生暑假训练太累怎么办 高强度运动后性功能不好怎么办 运动后第二天全身酸痛怎么办 运动后心慌想吐怎么办 激素停后全身疼怎么办 运动完头晕想吐怎么办