静态与实例共享使用方法

时间:2009-04-24 01:41:57

标签: java static methods instance

这是我想要确定的......

我有一个实用程序类可以将行附加到文本文件中。 这必须由许多其他类使用,例如 一个常见的日志文件。

在我的第一次实施中,我拥有了所有课程 想要使用它的是一个无参考的实例,例如

new Logger(logline,logname);

构造函数创建PrintWriter,追加该行 并关闭文件。

这似乎很浪费,因为有一个新实例 每一行都附加。

另一种方法是使用静态方法,称为“writeln” 在这个普通的课堂上,因为我已经理解了这一点 方法和数据重复使用相同的内存和&过...但

此静态方法创建PrintWriter的实例 做它的工作,所以这并不意味着一个新的实例 为每一行创建PrintWriter,例如#1?

无论如何,(我对Java比较新)是有的 众所周知的,批准的方式,或做我们 只是创造了,让垃圾收集器 在我们之后清理?

由于

3 个答案:

答案 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.");

我没有展示任何实施细节,但我希望这足以让你前进。