这是我想要确定的......
我有一个实用程序类可以将行附加到文本文件中。 这必须由许多其他类使用,例如 一个常见的日志文件。
在我的第一次实施中,我拥有了所有课程 想要使用它的是一个无参考的实例,例如
new Logger(logline,logname);
构造函数创建PrintWriter
,追加该行
并关闭文件。
这似乎很浪费,因为有一个新实例 每一行都附加。
另一种方法是使用静态方法,称为“writeln” 在这个普通的课堂上,因为我已经理解了这一点 方法和数据重复使用相同的内存和&过...但
此静态方法创建PrintWriter
的实例
做它的工作,所以这并不意味着一个新的实例
为每一行创建PrintWriter
,例如#1?
无论如何,(我对Java比较新)是有的 众所周知的,批准的方式,或做我们 只是创造了,让垃圾收集器 在我们之后清理?
由于
答案 0 :(得分:5)
明智的答案是您应该使用“严重”的日志记录包,例如Commons Logging。
但是,要回答您的问题,在这种情况下,您应该使用静态方法(除非您希望在代码中维护日志记录类实例,在这种情况下,您应该遵循此线程中的其他答案)。此外,您应该有一个静态字段,例如,Map<String, PrintWriter>
初始化。 (您不必使用String
作为密钥:如果您需要有限数量的日志记录目标类型,请使用枚举。)
然后,当你的方法看到地图中不存在的一个键时,它会在现场创建PrintWriter
,并将其粘贴在地图中。您可能希望使用ConcurrentHashMap
作为支持映射类型,因此它是线程安全的。
您还需要提供一种关闭日志记录目标的方法(它还将清除地图中的相关条目)。
祝你好运!答案 1 :(得分:3)
你不应该在你的构造函数中做任何工作。
构造函数用于对象设置。
您应该创建一个Log()方法来进行实际的日志记录。
Logger l = new Logger();
l.Log(logline,logname);
l.Log(logline,logname);
或者您可以将记录器设置为单身人士。
Logger.getInstance().Log(logline, logname);
Java中的Singleton模式: http://www.javaworld.com/javaworld/jw-04-2003/jw-0425-designpatterns.html
答案 2 :(得分: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.");
我没有展示任何实施细节,但我希望这足以让你前进。