Стиль кодирования Java при создании новой локальной переменной для ссылки на переменные-члены класса - PullRequest
1 голос
/ 25 сентября 2019

Это общий вопрос стиля кодирования, касающийся того, какой стиль является более общим или элегантным.

При чтении исходного кода коллекции Java первый стиль встречался чаще, чем второй.Может ли кто-нибудь осветить это?ИМХО, второй стиль более лаконичен, чем первый, но на самом деле, первый должен быть выкуплен более элегантно, в чем я не могу спорить.

  1. создание локальной переменной.
private Set<K> keySet;

public Set<K> keySet() {
    Set<K> ks = keySet;
    if (ks == null) {
        ks = new KeySet();
        keySet = ks;
    }
    return ks;
}

работает с переменной члена класса.
public Set<K> keySet() {
    if (keySet == null) {
        keySet = new KeySet();
    }
    return keySet;
}

Ответы [ 2 ]

2 голосов
/ 26 сентября 2019

Это попытка микрооптимизации отложенная инициализация.

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


Попытка оптимизации здесь заключается в уменьшении количества операций getfield.

Поскольку набор инициализируется только один раз, нас беспокоит производительность после инициализация.

1-й блок кода избегает getfield, гарантируя, что проверка для null является локальной. После инициализации набора 1-й кодовый блок будет всегда приводить к одному getfield вызову, тогда как 2-й кодовый блок всегда приведет к двум getfield звонки.

0 голосов
/ 25 сентября 2019

Это просто стиль кодирования, за которым следует Java.Во втором способе «объявление переменной члена» определяет переменную, более читабельную, и при определении переменной того же типа в методе (первый способ), если разработчик определит то же имя, что и Set<K> keySet = this.keySet; вместо Set<K> ks = keySet;, это приведет к путанице при чтении кода.

Так много сообществ, включая Android, придерживаются немного другого стиля для одного и того же.«m» используется в качестве префикса для объявления переменной-члена.Поэтому, если я перепишу приведенный выше код, это будет

  1. Создание локальной переменной.
private Set<K> mKeySet;

public Set<K> keySet() {
    Set<K> keySet = mKeySet;
    if (keySet == null) {
        keySet = new KeySet();
        mKeySet = keySet;
    }
    return keySet;
}
Работа с переменной члена класса.
public Set<K> keySet() {
    if (mKeySet == null) {
        mKeySet = new KeySet();
    }
    return mKeySet;
}

Итак, у вашего добавленного кода есть стиль, которому следует Java.

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