2014-01-08 44 views
0

的超類我有一些小的記錄系統,它可處理String s,這是所有工作的罰款。
現在,我想補充的信號,我希望有一個新的生產線的能力,而且由於我的結構,我認爲這是最好使用一個特殊的標誌,一些示例代碼:字符串(或T)和枚舉

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的標誌。

但是目前我queueString型的,我想它包括String(一個更普遍的答案或許T)和LogFlagEnum

我知道我可以使用Object類型,但不是最小的可能類型和definatey也不安全,我想什麼。

什麼是執行規定的行爲的最好辦法?

+1

唯一共同的超類的字符串和枚舉的是java.lang.Object中。你真的想混合類型嗎?如果是這樣,那麼你應該再次考慮泛型的設計和使用。 –

+0

有一個'Message'隊列並使用'toString'方法進行記錄。或者添加一個文字新行 - 「System.lineSeparator()' - 到隊列中。 –

+0

@MenoHochschild我認爲/希望可以通過使用'Class '來完成,其中'T'是* some *的定義。 – skiwi

回答

2

解決方案1:使用對象。這不是什麼大事,因爲它只是內部實現。

解決方案2:使用的CharSequence;讓枚舉實現CharSequence。不完全有幫助。但是一般來說CharSequence比接受文本參數的String要好。

解決方案3:Java中的每個問題可以通過引入新的類型來解決。你的隊列可以是隊列的LogEntry's,而LogEntry可以包含String/enum/whatever。

+0

由'String message'和'LogFlag flag'組成的'LogEntry'可能是最好的解決方案? – skiwi

+0

是的。或者你可以有StringLogEntry和FlagLogEntry。這是一個導致java架構師職業生涯的滑坡。 – ZhongYu