Как заставить все классы Java иметь атрибут - PullRequest
2 голосов
/ 08 апреля 2011

Я хочу, чтобы все классы Java имели переменную logger:

private static final Logger logger = Logger.getLogger(Foo.class);

Но я должен напечатать эту строку во всех классах.

Есть ли способ автоматизировать это? Помогут ли мне аннотации в этом?

Ответы [ 10 ]

6 голосов
/ 08 апреля 2011

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

Вам нужен адаптированный новый шаблон класса.Если вы используете eclipse, вы можете найти его в Настройки в Java-> Кодовый стиль-> Шаблоны кода , затем переключиться на правую часть диалогового окна и выбрать Код-> Новые файлы Java

В Intellij идея вы можете найти шаблоны в Файл-> Настройки-> Шаблоны файлов-> Класс

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

5 голосов
/ 08 апреля 2011

Если вы хотите пойти по пути наследования, что, по-моему, не очень хорошо, вы можете наследовать от абстрактного базового класса, где защищенный нестатический Logger объявлен так:

protected final Logger log = Logger.getLogger(getClass().getName());

Таким образом, класс регистратора будет класса реализации. Но, конечно, есть проблема с Java, допускающим только одиночное наследование, которое может привести к проблемам при расширении другого класса.

Лично я использую AOP (Aspect-Oriented Programming) для ведения журнала, но это не всегда решение.

3 голосов
/ 08 апреля 2011

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

enter image description here

А потом

enter image description here

3 голосов
/ 08 апреля 2011

Есть ли способ автоматизировать это?

Конечно, не в простой Java.

Наследование не решит эту проблему ... если вам нужно поле с static и / или private. Самое близкое, что вы можете придумать, это добавить такой метод в базовый класс:

    protected final Logger getLogger() {
        return Logger.getLogger(this.getClass());
    }

и это будет довольно дорого.

В качестве альтернативы, вы можете добавить неосновное, нестатическое поле в базовый класс; * например 1014 *

    protected final Logger log = Logger.getLogger(this.getClass());

Или вы можете заставить свою IDE или какой-либо процессор / генератор исходного кода добавить поле static private Logger к исходному коду каждого класса.

Могут ли аннотации помочь мне в этом?

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

0 голосов
/ 08 апреля 2011

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

В качестве небольшого взлома вы можете опустить 'private' (делая защищенный пакет logger), чтобы избежать надоедливых предупреждений Eclipse 'unused', когда в настоящее время нет строки кода, использующей ваш logger, без необходимости добавлять аннотацию SuppressWarnings .

0 голосов
/ 08 апреля 2011

Очень примитивным решением было бы создание абстрактного класса, содержащего атрибут, который вы хотите добавить ко всем своим классам. Но так как java не поддерживает множественное наследование, это решение не подходит, если вам нужно наследовать от других классов.
Насколько я знаю, аннотации не предназначены для обеспечения такой функциональности.

0 голосов
/ 08 апреля 2011

Learn Dependency Injection , используйте фреймворк, такой как Seam (включая Weld), Spring или Guice, а затем используйте аспектно-ориентированное программирование ( AOP ) для автоматического входавсе вызываемые методы (и, необязательно, сколько времени занимает этот метод).

Есть случаи, когда вы все равно захотите определить Logger и выполнить некоторую регистрацию внутри некоторых методов, но подход AOP все же удалитмного вашего стандартного кода, который нарушает принцип СУХОЙ (не повторяйся).

0 голосов
/ 08 апреля 2011

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

Вторая проблема: регистратор всегда будет инициализирован с классом абстрактного родительского класса. Если вас это не беспокоит ....

0 голосов
/ 08 апреля 2011

использовать наследование

наследование может помочь вам

0 голосов
/ 08 апреля 2011

Ваши классы должны наследовать это от общего базового класса.

Я не гуру Java, но что-то подобное должно быть возможно

public class Vehicle
{
    protected Logger logger = Logger.getLogger(this.getClass());
}

public class Car extends Vehicle
{
}

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

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