簡體   English   中英

靜態與實例共享使用方法

[英]Static vs. instance method for shared use

這是我想要確定的......

我有一個實用程序類來將行附加到文本文件。 這必須由許多其他類使用,例如常見的日志文件。

在我的第一個實現中,我讓所有想要使用它的類創建了一個無引用的實例,例如

new Logger(logline,logname);

構造函數創建PrintWriter ,追加該行並關閉該文件。

這似乎很浪費,因為每個附加的行都會生成一個新實例。

另一種方法是在這個公共類中使用一個名為“writeln”的靜態方法,因為我已經理解靜態方法和數據一遍又一遍地重復使用相同的內存......但是

這個靜態方法創建了一個PrintWriter實例來完成它的工作,所以這是不是意味着為每一行創建了一個新的PrintWriter實例,比如#1?

無論如何,(我對Java相對較新)是否有一種眾所周知的,批准的方式,或者我們只是創造了,讓垃圾收集器在我們之后清理?

謝謝

明智的答案是你應該使用“嚴重”的日志包,例如Commons Logging

但是,要回答您的問題,在這種情況下,您應該使用靜態方法(除非您希望在代碼中維護日志記錄類實例,在這種情況下,您應該遵循此線程中的其他答案)。 此外,您應該有一個靜態字段,例如, Map<String, PrintWriter> (您不必使用String作為鍵:如果您需要有限數量的日志記錄目標類型,請使用枚舉。)

然后,當你的方法看到一張在地圖中不存在的鍵時,它會在現場創建PrintWriter ,並將其粘貼在地圖中。 您可能希望使用ConcurrentHashMap作為支持映射類型,因此它是線程安全的。

您還需要提供一種關閉日志記錄目標的方法(它還將清除映射中的關聯條目)。

祝好運!

你不應該在你的構造函數中做任何工作。

構造函數用於對象設置。

您應該創建一個Log()方法來執行實際的日志記錄。

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

或者您可以將記錄器設置為Singleton。

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

Java中的單例模式: http//www.javaworld.com/javaworld/jw-04-2003/jw-0425-designpatterns.html

此對象可能需要保留幾種狀態,尤其是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.");

我沒有展示任何實現細節,但我希望這足以讓你前進。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM