Альтернатива статическим блокам без неиспользуемой переменной - PullRequest
0 голосов
/ 08 октября 2018

Как альтернатива статическим блокам , документы Oracle предлагают вызывать метод (ы), а в примере используется присвоение переменной:

public static varType myVar = initializeClassVariable();

Преимуществочастных статических методов заключается в том, что они могут быть повторно использованы позже, если вам нужно повторно инициализировать переменную класса.

Но если мне не нужны (и я хочу избежать неиспользованных) дополнительные переменные, а также оператор return вмой статический блок, что является лучшим способом для вызова статического кода?

Вызов статического метода в конструкторе - неправильный дизайн для выполнения статического кода один раз (конструктор может быть private для служебного класса) для статического блока

public MyClass() {
     MyClass.initializeClassVariable();
}

Значит, единственное улучшение заключается в снижении уровня доступа к переменной до частного?

 private static varType myVar = initializeClassVariable();

Или лучше использовать статический блок и добавить туда метод?

static {
    initializeClassVariable();
}

1 Ответ

0 голосов
/ 08 октября 2018

«Альтернатива статическим блокам» - это инициализация одного статического поля.

Пример:

class A {
    static Map<String, Integer> romans;
    static {
        romans = new HashMap<>();
        romans.put("I", 1);
        romans.put("V", 5);
        romans.put("X", 10);
    }
}

Альтернатива:

class A {
    static Map<String, Integer> romans = initRomans();

    private static Map<String, Integer> initRomans() {
        Map<String, Integer> r = new HashMap<>();
        r.put("I", 1);
        r.put("V", 5);
        r.put("X", 10);
        return r;
    }
}

Как говорится в статье, с помощью этого кода вы можете сбросить статическое поле.

    public static void resetRomans() {
        romans = initRomans();
    }

Если ваш код делает что-то другое, то «альтернатива» не применима, и вы пишете код в блоке статического инициализатора.

class A {
    static {
        Manager.register(A.class);
    }
}
...