Как заставить экземпляр статических полей - PullRequest
7 голосов
/ 11 мая 2011

Я был довольно удивлен выводом следующего кода:

Загородный класс

public class Country {

    private static Map<String, Country> countries = new HashMap<String, Country>();

    private final String name;

    @SuppressWarnings("LeakingThisInConstructor")
    protected Country(String name) {
        this.name = name;
        register(this);
    }

    /** Get country by name */
    public static Country getCountry(String name) {
        return countries.get(name);
    }

    /** Register country into map */
    public static void register(Country country) {
        countries.put(country.name, country);
    }

    @Override
    public String toString() {
        return name;
    }

    /** Countries in Europe */
    public static class EuropeCountry extends Country {

        public static final EuropeCountry SPAIN = new EuropeCountry("Spain");
        public static final EuropeCountry FRANCE = new EuropeCountry("France");

        protected EuropeCountry(String name) {
            super(name);
        }
    }

}

Основной метод

System.out.println(Country.getCountry("Spain"));

выход

нуль

Есть ли какой-нибудь чистый способ заставить класс, расширяющий Country, загружаться, чтобы карта стран содержала все экземпляры Country?

Ответы [ 3 ]

7 голосов
/ 11 мая 2011

Да, используйте статический блок инициализатора :

public class Country {

    private static Map<String, Country> countries = new HashMap<String, Country>();

    static {
        countries.put("Spain", new EuroCountry("Spain"));

    }

...
3 голосов
/ 11 мая 2011

Ваш класс EuropeCountry не был загружен в тот момент, когда вы позвонили Country.getCountry("Spain").Правильное решение было бы

private static Map<String, Country> countries = new HashMap<String, Country>();

static {
    // Do something to load the subclass
    try {
        Class.forName(EuropeCountry.class.getName());
    } catch (Exception ignore) {}
}

Это всего лишь пример ... Есть и другие способы достичь того же (см. Также ответ Петра)

0 голосов
/ 11 мая 2011

Вам нужно загрузить класс EuropeCountry. Любой ссылки на нее перед звонком в страну будет достаточно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...