2016-12-15 3 views
1

У меня есть класс, похожий на этот:Определение констант в Java и использовать их в коллекции

class DomainTypes { 
    public static final DomainType DOMAIN_1 = DomainType.of("example1.com"); 
    public static final DomainType DOMAIN_2 = DomainType.of("example2.com"); 
    public static final DomainType DOMAIN_3 = DomainType.of("example3.com"); 

    public static Set<DomainType> getDomainTypes() { 
    return ImmutableSet.of(
     DOMAIN_1, DOMAIN_2, DOMAIN_3 
    ); 
    } 
} 

Но это чревато ошибками. Если кто-то добавит домен в качестве новой константы, она может забыть добавить его в метод getDomainTypes(). Я не хочу, если возможно, использовать отражение.

Мне нужно иметь класс DomainType в другом модуле (jar) - вроде модуля API - допустим, модуль dns-api, чем DomainTypes. DomainTypes довольно конфигурируется, и он находится в модуле web-app, который зависит от модуля dns-api. С перечислением я не мог отделить конфигурацию от объекта с реализованной логикой, и я не смог бы повторно использовать модуль dns-api в другом приложении. Поэтому я думаю, что использование enum для меня не является решением.

+3

Используйте перечисление и домен как там есть частное поле. Затем можно использовать 'BlubEnum.values ​​()'. – Tom

+0

Вы можете использовать ['enum'] (https://docs.oracle.com/javase/tutorial/java/javaOO/enum.html) вместо класса с константами. У перечислений автоматически есть метод 'values ​​()', который дает вам все константы в 'enum'. – Jesper

+0

А также 'enum' имеет связанные классы, такие как' EnumSet', где вы можете получить эти значения как очень эффективный набор. – RealSkeptic

ответ

1

Используйте enum вместо класса с константами:

public enum DomainType { 
    DOMAIN_1("example1.com"), 
    DOMAIN_2("example2.com"), 
    DOMAIN_3("example3.com"); 

    private final String url; 

    DomainType(String url) { 
     this.url = url; 
    } 

    public String getUrl() { 
     return url; 
    } 
} 

Перечисления автоматически метод values(), который дает вам массив всех значений:

DomainType[] domainTypes = DomainType.values(); 
+0

Я также рассматривал 'enum'. Но мне нужно иметь класс DomainType в другом модуле (jar) - вроде модуля API, скажем, 'dns-api', чем' DomainTypes'. 'DomainTypes' довольно конфигурируется и находится в модуле' web-app', который зависит от модуля 'dns-api'. С 'enum' я не мог отделить конфигурацию от объекта с реализованной логикой, и я не смог бы повторно использовать модуль' dns-api' в другом приложении. – fxmasa

Смежные вопросы