我有一個特例,如下所示。 我有Listener類和Uploader類。 Listener類通過網絡監聽消息,處理它們並從中創建另一個小對象。有一個有狀態的輔助類是不好的做法嗎?
public class Listener {
Uploader uploader;
Listener(String location) {
uploader = new Uploader(location);
}
public void listen(Message msg) {
ProcessedObject obj = process(msg);
uploader.add(obj);
}
public void terminate() {
if (null != uploader) {
uploader.finish();
}
}
}
上傳器類需要經由add方法一個對象,並決定何時上載器。爲此,它維護一個列表。它還具有位置字符串,這是特定於一個偵聽器的位置字符串。這裏的要點:
/**
* This class is not thread safe, and an object should not be shared across threads
*
*/
public class Uploader {
String location;
List<ProcessedObject> objects;
Uploader(String location) {
this.location = location;
}
void add(ProcessedObject obj) {
objects.add(obj);
if (objects.size() > PARTITION_SIZE) {
uploadObjects(objects);
objects.clear();
}
}
void finish() {
uploadObjects(objects);
}
}
所以,如果對象的數量大於PARTITION_SIZE它上傳。應用程序中有多個偵聽器,每個偵聽器都在單獨的線程上運行。每個監聽器都有它自己的上傳器對象。我已經明確提到這個類在javadoc中不是線程安全的。
現在我的問題是,這是一個很好的做法嗎?
我的一些同事說這不是一個好的做法,並建議使用靜態方法上傳,而不是創建上傳器的實例。但我的觀點是,這將使我的聽衆班變得凌亂(因爲聽衆將不得不維護計數,並在最後再次檢查並上傳,然後終止剩餘的對象)
用我的方法,整個分區和上傳邏輯在上傳類中可用,因此它提高了可讀性和可維護性。
我的問題是,我的方法是一種不好的做法(考慮到我還專門叫出上傳器不是線程安全的)?
另外,有什麼設計模式,我想在這裏做什麼?如果是,哪一個?
編輯:我接受我沒有正確地提出問題。我不關心分區或上傳。關於爲每個線程創建Uploader類的一個對象的方法,以及使用靜態方法創建一個無狀態Uploader類來完成這項工作。
無論上傳剩餘的對象,還是我應該分區,都不是這個問題的關注點。
如果我沒有錯,在這種情況下,我將不得不維護共享的對象列表,上傳者線程可以定期監視和上傳對象。你是在提議嗎? – Kartik
@Kartik這是一個可能的實現。或者每個監聽器線程都可以有一個關聯的上傳器線程。我的觀點是聽衆應該完全透明 –
這實際上是有道理的。但即使在這種情況下,它的上傳者必須維持分區狀態的權利? – Kartik