[英]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.