Должен ли я кэшировать возвращаемое значение геттера, если это просто делегат? - PullRequest
0 голосов
/ 25 августа 2009

Например:

Я создаю файл CSV, и у меня есть объект CsvOptions, который содержит несколько параметров для создания файла CSV.

if (cells.hasNext()) {
    output.write(csvOptions.getDelimiter());
}

csvOptions - это простой объект-контейнер, такого рода, что вы склонны вообще не использовать никаких методов получения. Получатель просто возвращает значение из частного поля.

Стоит ли кэшировать возвращаемое значение тривиального геттера, например getDelimiter() в моем примере, в терминах

  • ... скорость выполнения?
  • ... стиль кодирования?

Ответы [ 3 ]

4 голосов
/ 25 августа 2009

JIT должен иметь возможность встроить все тривиальные геттеры во время выполнения. Так что это на самом деле не проблема.

Что касается стиля кодирования, я бы предпочел прямой вызов - если только он не делает строку, где это происходит, слишком длинной - когда вам нужно значение только один раз.

2 голосов
/ 25 августа 2009

Кэширование не должно быть вариантом. Если это контейнер, сделайте его неизменным, то есть сделайте все его поля общедоступными final.

1 голос
/ 25 августа 2009

Я считаю, что рефакторинг Мартина Фаулера явно рекомендует не делать это

char delimiter = csvOptions.getDelimiter();

// code here to use delimiter

вместо этого он предпочитает использовать

csvOptions.getDelimiter()

непосредственно. Аргумент двоякий. Во-первых, должно быть минимальное снижение производительности, компилятор и JITers могут оптимизировать вызов функции. Во-вторых, используя метод, мы на самом деле делаем код проще для рефакторинга в будущем.

См. Ссылку на книгу Фаулера здесь

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