Второй вариант лучше с точки зрения дизайна и производительности, предполагая, что регистратор необходим в родительском классе.Наличие двух атрибутов, содержащих одно и то же значение, может сбивать с толку и занимать больше места.(Последнее имеет значение только в том случае, если создается большое количество экземпляров.)
Однако:
- Я бы объявил его как
private
в родительском классе и предоставил protected final
метод получения. - Если вы объявите его как атрибут
protected
родительского класса, вы должны также сделать его final
. Если вы используете один изСтандартные API-интерфейсы ведения журнала - это обычная практика, когда объект создает свой собственный регистратор;например, с Log4j
this.logger = Logger.getLogger(this.getClass());
Это все относительно незначительные проблемы, но (IIRC) набор правил PMD по умолчанию включает в себя правило, содержащее атрибуты protected
.
... но я часто сталкивался с первой версией в дикой природе.
Да, много кода в дикой природе не совсем идеально, и, как я полагаю, этоотносительно незначительные проблемы.
FOLLOWUP
говорят, что оба поля являются окончательными.Как вы думаете, в первом случае компилятор будет достаточно умен, чтобы выяснить, что указатели всегда будут одинаковыми и свернуть их в одно поле?
Нет.Я не думаю, что компилятор сделал бы это:
Любая оптимизация должна работать перед лицом отражающего доступа (и даже обновления) атрибутов.В этом случае код отражения должен был бы знать об оптимизации и отображать запросы для одной версии поля на другую.
В большинстве случаев выигрыш за такую оптимизацию был бы небольшими стоимость ЦП компилятора JIT, выясняющего, что оптимизация допустима, будет значительной.
(Имейте в виду, что эта оптимизация может быть выполнена только JIT-компилятором. Компилятору байт-кода не хватает информации для выполнения оптимизации. В частности, он не знает, чтоокончательный код конструкторов классов таков. Также имейте в виду, что если не будет большого количества экземпляров рассматриваемых объектов, экономия пространства будет незначительной.)
Однако я былиспользуя некоторое время Guice, похоже на стандартную практику внедрения логгера вместо того, чтобы полагаться на статическую фабрику.
Я думаю, что это специфическая для Guice идиома / практика.Обычные Java-приложения / библиотеки редко передают логгеры в качестве аргументов из моего опыта.