我有一个特例,如下所示。 我有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