Java enum在实践中,代码错误有待改进

Java enum在实践中,代码错误有待改进,java,optimization,enumeration,Java,Optimization,Enumeration,我想改进我对JDK1.5的使用,并停止使用私有静态final字符串而不是enum。这似乎是建议的 但是现在我的常量类看起来是这样的: public class CEnum{ /** * @author JJA * date : 20/10/2010 */ public enum ListTypeAffichage { DEP("DEPOT_TVA"), PAD("PAS_DEPOT_TVA"), NORM("CAT_NORMALE")

我想改进我对JDK1.5的使用,并停止使用私有静态final字符串而不是enum。这似乎是建议的

但是现在我的常量类看起来是这样的:

public class CEnum{
    /**
     * @author JJA
     * date : 20/10/2010
     */
    public enum ListTypeAffichage {
        DEP("DEPOT_TVA"), PAD("PAS_DEPOT_TVA"), NORM("CAT_NORMALE"), CAP("CAT_PARTICULIERE"), CAA("CAT_AUTRE_CAS");

        private final String sName;

        /**
         * @param name String
         */    
        ListTypeAffichage(String name) {
            this.sName = name;
        }

        /**
         * @return String
         */
        public String getType() {
            return sName;
        }        
    }

    /**
     * @author JJA
     * date : 20/10/2010
     */
    public enum ListTypeCategorie {
        DEDUIRE("SOMME_A_DEDUIRE"), AJOUTER("SOMME_A_AJOUTER");

        private final String sName;

        /**
         * @param name String
         */
        ListTypeCategorie(String name) {
            this.sName = name;
        }

        /**
         * @return String
         */
        public String getType() {
            return sName;
        }    
    }

    /**
     * @author JJA
     * date : 26/10/2010
     */
    public enum ListInterval {
        POS("POSITIF"), NS("NON_SIGNE");

        private final String sName;

        /**
         * @param name String
         */
        ListInterval(String name) {
            this.sName = name;
        }

        /**
         * @return String
         */
        public String getInterval() {
            return sName;
        }    
    }
}
而不是

public class ConstantesADMD {
    public static final List<String> typeAffich = new ArrayList<String>();
...
    ConstantesADMD(){
        typeAffich.add("DEPOT_TVA");
        typeAffich.add("PAS_DEPOT_TVA");
        typeAffich.add("CAT_NORMALE"); 

...       
    }
}
你建议我做什么改进?
注意:忘记我第一个问题的最后几句,我需要索引。如果我必须发布另一个问题,请告诉我,编辑我的第一个问题似乎更容易。

我会像命名字符串一样命名枚举常量。然后可以使用该方法访问该名称。例如:

public enum ListTypeAffichage {
    DEPOT_TVA, PAS_DEPOT_TVA, CAT_NORMALE, CAT_PARTICULIERE, CAT_AUTRE_CAS;

    /**
     * @return String
     */
    public String getType() {
        return toString();
    }        
}
当然,您也可以同时跳过
getType()
,而是使用
toString()
访问“type”:

ListTypeAffichage myEnum = ListTypeAffichage.CAT_PARTICULIRE;
System.out.println("Type: " + myEnum.toString());             // like this...
System.out.println("Type: " + myEnum);                        // ...or like this

根据API,这比直接使用更好:

public final String name()

[…]大多数程序员应该优先使用toString()方法,而不是这个方法


我会像您命名字符串一样命名枚举常量。然后可以使用该方法访问该名称。例如:

public enum ListTypeAffichage {
    DEPOT_TVA, PAS_DEPOT_TVA, CAT_NORMALE, CAT_PARTICULIERE, CAT_AUTRE_CAS;

    /**
     * @return String
     */
    public String getType() {
        return toString();
    }        
}
当然,您也可以同时跳过
getType()
,而是使用
toString()
访问“type”:

ListTypeAffichage myEnum = ListTypeAffichage.CAT_PARTICULIRE;
System.out.println("Type: " + myEnum.toString());             // like this...
System.out.println("Type: " + myEnum);                        // ...or like this

根据API,这比直接使用更好:

public final String name()

[…]大多数程序员应该优先使用toString()方法,而不是这个方法

每个枚举都有一个name()方法,该方法返回常量的确切字符串表示形式。所以你可以这样做:

 public enum ListTypeAffichage {
        DEPOT_TVA, PAS_DEPOT_TVA, CAT_NORMALE, CAT_PARTICULIERE, CAT_AUTRE_CAS                  
    }
然后

ListTypeAffichage.DEPOT_TVA.name();
每个枚举都有一个name()方法,该方法返回常量的确切字符串表示形式。所以你可以这样做:

 public enum ListTypeAffichage {
        DEPOT_TVA, PAS_DEPOT_TVA, CAT_NORMALE, CAT_PARTICULIERE, CAT_AUTRE_CAS                  
    }
然后

ListTypeAffichage.DEPOT_TVA.name();

通过使用缩写(DEP、PAD、NORM)等,您创建了(DEPOT_TVA、PAS_DEPOT_TVA、CAT_NORMALE)等的别名

如果您想保留缩写,那么您必须按照现有的方式维护枚举

如果你愿意去掉缩写,那么你可以如下更改你的枚举,我已经在枚举中包含了一个main方法来演示它的用法

public enum ListTypeAffichageNames {
    DEPOT_TVA,
    PAS_DEPOT_TVA,
    CAT_NORMALE,
    CAT_PARTICULIERE,
    CAT_AUTRE_CAS;


    public static void main(String[] args) {
        System.out.println(DEPOT_TVA.toString());
        ListTypeAffichageNames affichage = ListTypeAffichageNames.valueOf("DEPOT_TVA");
        System.out.println(affichage.toString());
    }
}  
除此之外,当前的常量结构不允许进行编译时类型检查,也不阻止在运行时发生以下情况:

    ConstantesADMD.typeAffich.clear();
    // or
    ConstantesADMD.typeAffich.remove("DEPOT_TVA");
    ConstantesADMD.typeAffich.add("dEpOt-tVa");

通过使用缩写(DEP、PAD、NORM)等,您创建了(DEPOT_TVA、PAS_DEPOT_TVA、CAT_NORMALE)等的别名

如果您想保留缩写,那么您必须按照现有的方式维护枚举

如果你愿意去掉缩写,那么你可以如下更改你的枚举,我已经在枚举中包含了一个main方法来演示它的用法

public enum ListTypeAffichageNames {
    DEPOT_TVA,
    PAS_DEPOT_TVA,
    CAT_NORMALE,
    CAT_PARTICULIERE,
    CAT_AUTRE_CAS;


    public static void main(String[] args) {
        System.out.println(DEPOT_TVA.toString());
        ListTypeAffichageNames affichage = ListTypeAffichageNames.valueOf("DEPOT_TVA");
        System.out.println(affichage.toString());
    }
}  
除此之外,当前的常量结构不允许进行编译时类型检查,也不阻止在运行时发生以下情况:

    ConstantesADMD.typeAffich.clear();
    // or
    ConstantesADMD.typeAffich.remove("DEPOT_TVA");
    ConstantesADMD.typeAffich.add("dEpOt-tVa");

这比我第一个问题的答案要好,谢谢。我使用了name方法而不是toString。这比我第一个问题的答案要好。谢谢。我使用name方法而不是toString。