我有一些小型日志系统,它可以处理String
,一切正常。
现在我想添加功能来表明我想要一个新行,并且由于我的结构,我认为最好使用一个特殊的标志,一些示例代码:
public class BaseLogger implements Runnable, LogConsumer {
//....
private final BlockingQueue<String> queue;
//....
@Override
public void run() {
while (running) {
try {
if (consumers.isEmpty()) {
synchronized(consumersEmptyLock) {
consumersEmptyLock.wait();
}
}
String message = queue.take();
for (LogConsumer consumer : consumers) {
consumer.consume(message);
}
} catch (InterruptedException ex) {
handleInterrupt();
}
if (requestShutdown && queue.isEmpty()) {
running = false;
}
}
}
public void log(String message) {
if (message == null) {
throw new IllegalArgumentException("customlogger.CustomLogger.log: message == null");
}
queue.offer(message);
}
现在我想添加一个枚举,比如说 LogFlagEnum
,其中包含一个名为 NEW_LINE
的标志。
但是目前我的queue
是String
类型,我希望它同时包含String
(或者也许T
以获得更一般的答案)和 LogFlagEnum
。
我知道我可以使用Object
作为类型,但这不是最小的可能类型,并且绝对不安全,也是我想要的。
实现指定行为的最佳方式是什么?
最佳答案
解决方案1:使用Object.这没什么大不了的,因为它只是内部实现。
解决方案2:使用CharSequence;让枚举实现 CharSequence。不太有帮助。但总的来说,CharSequence 在接受文本参数方面比 String 更好。
解决方案3:Java中的每个问题都可以通过引入新类型来解决。您的队列可以是 LogEntry
的队列,并且 LogEntry
可以包含 String/enum/whatever。
关于java - String(或 T)和 Enum 的父类(super class),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20996001/