Java enum на практике, плохой код для улучшения - PullRequest
0 голосов
/ 27 октября 2010

Я хочу улучшить свое использование JDK 1.5 и прекратить использовать приватную статическую конечную строку вместо 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"); 

...       
    }
}

Мой код кажется очень плохим, но по крайней мере работает. Для каждого перечисления я должен добавить избыточный код:

private final String sName;

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

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

Какое улучшение вы мне посоветуете? Примечание: забудьте последние предложения моего первого вопроса, мне нужен указатель. Скажите, если мне нужно отправить еще один вопрос, редактирование моего списка кажется более простым.

Ответы [ 3 ]

3 голосов
/ 27 октября 2010

Я бы назвал мои перечислимые константы так же, как вы назвали свои строки. Затем вы можете получить доступ к имени, используя метод Enum.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():

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

Согласно API, это лучше, чем использовать Enum.name() напрямую:

public final String name()
[...] Большинство программистов должны использовать метод toString () вместо этого [...]

2 голосов
/ 27 октября 2010

У каждого перечисления есть метод name (), который возвращает точное представление строки константы. Так что вы можете сделать это:

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

, а затем

ListTypeAffichage.DEPOT_TVA.name();
0 голосов
/ 27 октября 2010

Используя сокращения (DEP, PAD, NORM) и т. Д., Вы создали псевдонимы (DEPOT_TVA, PAS_DEPOT_TVA, CAT_NORMALE) и т. Д.

Если вы хотите сохранить аббревиатуры, вам придется сохранять перечисление таким, каким оно есть.

Если вы готовы отказаться от сокращений, вы можете изменить перечисление, как показано ниже. Я включил основной метод в перечисление, чтобы продемонстрировать его использование.

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");
...