Создание конечных переменных класса статичными в GWT - PullRequest
2 голосов
/ 13 марта 2012

В Java, когда полю final присваивается постоянное значение времени компиляции, обычно имеет смысл объявить его static. Это экономит накладные расходы в соответствии с соответствующим правилом PMD.

Имеет ли какой-либо смысл или разницу делать это в GWT в отношении сгенерированного кода Javascript?

Ответы [ 2 ]

3 голосов
/ 13 марта 2012

Если переменная назначается, когда она объявлена ​​как final, тогда да, static имеет определенный смысл, но есть случаи, когда она не должна быть статической:

public MyClassWithFinal {
    private final String finalVar;
    public MyClassWithFinal(String name) {
         this.finalVar = name;
    }
}

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

Тем не менее,GWT будет встроенные / внутренние постоянные строковые значения, поэтому, если у вас есть несколько полей String, все они назначены одному и тому же значению, GWT, вероятно, обнаружит это и переведет их все в статическое состояние.

public final String constant = "Some Constant that really ought to be static";

GWT заметит, что этоникогда не назначается, за исключением случаев, когда он объявлен, и может даже удалить само поле.

Лучшее правило - начинать с лучшего (то есть наиболее читаемого, наиболее удобного в обслуживании, наиболее эффективного) кода Java и разбивать его только наслучаи, когда GWT требует чего-то конкретного.Это не один из таких случаев: компилятор должен выполнять одинаковые базовые оптимизации независимо от того, как вы это пишете.

2 голосов
/ 13 марта 2012

Поле, помеченное как окончательное, не означает, что оно является неизменным, только то, что его ссылка не будет указывать на какой-либо другой фрагмент памяти. Следовательно, имеет смысл делать поле статичным, только если оно действительно неизменяемое или примитивное.

Например, обычно объявляют списки как окончательные, если вы хотите убедиться, что они никогда не будут указывать на другой объект списка, но сам список все еще может быть заполнен данными, очищен, снова заполнен и т. Д. Конечно, каждый объект, объявляющий такой список, не обязательно хочет делиться им между всеми экземплярами.

private final List<...> list = new ArrayList<...>();

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

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