2009-04-24 2 views
2

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

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

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

new Logger(logline,logname);

Конструктор создает PrintWriter, добавляет строку и закрывает файл.

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

Альтернатива заключается в использовании статический метод, называемый «ИгНеЬп» в этом общем классе, так как я понял, что статические методы и данные повторно использовать ту же память над & над ... но

этот статический метод создает экземпляр PrintWriter для выполнения его работы, поэтому это не означает, что для каждой строки, как # 1, создается новый экземпляр из PrintWriter?

Во всяком случае, (я относительно новым для Java) есть ли хорошо известно, одобрил способ сделать это, или мы просто создать прочь, и пусть мусор коллектор убирать за нами?

Благодаря

ответ

3

Вы не должны делать какие-либо работы в вашем застройщик.

Конструкторы предназначены для установки объектов.

Вам необходимо создать метод Log() для фактического ведения журнала.

Logger l = new Logger(); 
l.Log(logline,logname); 
l.Log(logline,logname); 

или вы можете настроить регистратор как Singleton.

Logger.getInstance().Log(logline, logname); 

Singleton Pattern в Java: http://www.javaworld.com/javaworld/jw-04-2003/jw-0425-designpatterns.html

2

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

// Pass only the PrintWriter into the constructor, not the line to be logged. 
Logger myLogger = new Logger(filename); 

...

// Log a message 
myLogger.log("This is a message to be logged."); 

// Log another message, just for kicks. 
myLogger.log("this shows that myLogger can be used repeatedly."); 

Я не показал какой-либо детали реализации, но я надеюсь, что это достаточно, чтобы ты ,

5

Разумным ответом является то, что вы должны использовать «серьезный» каротажный пакет, такой как Commons Logging.

Однако, чтобы ответить на ваш вопрос, в этом случае вы должны использовать статический метод (если вы не хотите поддерживать экземпляры классов ведения журнала в своем коде, и в этом случае вам следует следовать другим ответам в этом потоке). Кроме того, у вас должно быть статическое поле, которое инициализируется, например, Map<String, PrintWriter>. (Вам не нужно использовать String в качестве ключа: если вы хотите конечное количество целевых типов ведения журнала, используйте перечисление.)

Затем, когда ваш метод видит ключ, который еще не существует на карте, он 'd создайте PrintWriter на месте и наклеите его на карту. Вероятно, вы хотите использовать ConcurrentHashMap в качестве типа карты поддержки, поэтому он является потокобезопасным.

Вам также необходимо предоставить способ закрыть цель ведения журнала (которая также очистит связанную запись с картой).

Удачи вам!

+0

Спасибо, Крис! Это было предположение о том, что большинство из меня вызвало резонанс . Существует 2 файла журнала, один из которых является обычным протоколированием и один для ошибок - поэтому сохранение ссылок в HashMap (таблица отправки) отлично. Ключом может быть имя файла. Одна вещь, которую я не поймал .. О закрытии цели ведения журнала ... файл закрывается после каждой строки. Должен ли я также освобождать память? Думал, что это произойдет, когда JVM выйдет (при завершении программы). – javaphild

+0

Закрытие файла регистрации для каждой строки журнала означает, что вам необходимо повторно открыть для каждой строки журнала. Это будет серьезный удар производительности. Вы должны использовать flush(), если цель состоит в том, чтобы убедиться, что данные регистрации попадают на диск; который по-прежнему несет определенную производительность, но не так много. Однако, если вы все еще настаиваете на закрытии файла после каждой строки, вам не нужно беспокоиться о его закрытии в другом месте. Да, вы можете оставить эту карту автоматически. –

+0

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

Смежные вопросы