Статический метод против экземпляра для совместного использования - PullRequest
2 голосов
/ 24 апреля 2009

Вот что я пытаюсь определить ...

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

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

new Logger(logline,logname);

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

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

Альтернативой было использование статического метода, называемого "writeln" в этом общем классе, так как я понял, что статический методы и данные снова и снова используют одну и ту же память ... но

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

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

Спасибо

Ответы [ 3 ]

5 голосов
/ 24 апреля 2009

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

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

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

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

Удачи!

3 голосов
/ 24 апреля 2009

Вы не должны выполнять какую-либо работу в своем конструкторе.

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

Вы должны создать метод Log () для фактической регистрации.

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

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

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

Шаблон Singleton в Java: http://www.javaworld.com/javaworld/jw-04-2003/jw-0425-designpatterns.html

2 голосов
/ 24 апреля 2009

Есть несколько видов состояний, которые этот объект может удерживать, в частности 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.");

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

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