静态与实例共享使用方法

jav*_*ld 2 java methods static instance

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

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

在我的第一个实现中,我让所有想要使用它的类成为无引用的实例,例如

new Logger(logline,logname);

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

这似乎很浪费,因为每个附加的行都会生成一个新实例.

另一种方法是在这个公共类中使用一个名为"writeln"的静态方法,因为我已经理解静态方法和数据一遍又一遍地重复使用相同的内存......但是

这个静态方法创建了一个PrintWriter 实现其工作的实例,所以这是否意味着PrintWriter为每一行创建一个新实例,比如#1?

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

谢谢

Chr*_*ung 5

明智的答案是你应该使用"严重"的日志包,例如Commons Logging.

但是,要回答您的问题,在这种情况下,您应该使用静态方法(除非您希望在代码中维护日志记录类实例,在这种情况下,您应该遵循此线程中的其他答案).此外,您应该有一个静态字段,例如,a Map<String, PrintWriter>.(您不必使用String键作为键:如果您需要有限数量的日志记录目标类型,请使用枚举.)

然后,当你的方法看到一张在地图中不存在的键时,它会PrintWriter在现场创建,并将其粘贴在地图中.您可能希望使用a ConcurrentHashMap作为支持映射类型,因此它是线程安全的.

您还需要提供一种关闭日志记录目标的方法(它还将清除映射中的关联条目).

祝好运!