Конструктор не вызывается при создании регистратора Java - PullRequest
0 голосов
/ 21 марта 2012

Я реализовывал свой класс Logger, но по странной причине метод конструктора никогда не вызывался.В другом классе, когда я использую SRCLogger.getLogger().log(Level.INFO, "Message");, по пути не создается файл журнала.

Что мне не хватает?Что не так в этом коде?

Вот мой код:

public final class SRCLogger implements Serializable{

    private static final Logger l = Logger.getLogger("mySRCLogger");
    private FileHandler fh;

    private String ROOT_DIR = "C:\\Users\\Test\\Desktop\\";

    public SRCLogger(){
        System.out.println("Constructor.");
        try {
            fh = new FileHandler(ROOT_DIR + "SRCLog.log");
            fh.setFormatter(new SimpleFormatter());
            l.addHandler(fh);
            System.out.println("Try.");
        } catch (IOException ex) {
            Logger.getLogger(SRCLogger.class.getName()).log(Level.SEVERE, null, ex);
            System.out.println("Catch IOException.");
        } catch (SecurityException ex) {
            Logger.getLogger(SRCLogger.class.getName()).log(Level.SEVERE, null, ex);
            System.out.println("Catch SecurityException.");
        }
    }

    public static Logger getLogger(){
        return l;
    }   
}

Приветствия и заранее спасибо

Ответы [ 2 ]

4 голосов
/ 21 марта 2012

Все просто - вы никогда не вызываете конструктор.Вы вызываете это:

public static Logger getLogger(){
    return l;
}

... который возвращает l, статическое поле инициализируется так:

private static final Logger l = Logger.getLogger("mySRCLogger");

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

0 голосов
/ 21 марта 2012

Для того, чтобы конструктор был вызван, объект должен быть создан с использованием ключевого слова "new".Если вы вызываете только статические методы класса (но не объект), конструктор вызываться не будет.

Итак,

   SRCLogger.getLogger() 

- это вызываемый статический метод.

Если вы сделаете что-то вроде

   new SRCLogger().getLogger()

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

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