java - 一个类不实现方法的接口
问题描述
我有生产者获取数据 A,生产数据 B 并发送它
public interface Producer<T>{
void produce(T data);
void flush();
}
public class DataBaseProducer implements Producer<String>{
List<String> producedData = new ArrayList<>();
// create data
public void produce(String data){
producedData.add(transformData(data));
}
// send created data
public void flush(){
sendDataToDatabase(producedData);
}
}
public class MessageProducer implements Producer<String>{
public void produce(String data){
String line =transformData(data)
sendDataToMessageQueue(line);
}
public void flush(){
}
}
public static void main(String[] args) {
// get producer
Producer producer = getProducer(producerName)
BufferedReader reader;
try {
reader = new BufferedReader(new FileReader(file..));
String line = reader.readLine();
while (line != null) {
producer.produce(line)
line = reader.readLine();
}
reader.close();
producer.flush()
} catch (IOException e) {
e.printStackTrace();
}
}
为了证明我的问题,假设我有像上面这样的制作人。一个加载所有数据,然后在完成后立即批量发送,第二个立即发送数据(因此它不会批量发送数据,但每当创建新数据时它会立即发送)
大多数生产者会在每次加载数据后发送数据,但很少有人会立即发送。如果生产者立即发送数据,则该flush()
方法保持为空。然而,这似乎是一种不好的做法,并且可能违反了一些 OOP 原则。实现这一点的正确方法是什么?
感谢您的回答!
解决方案
在我看来,在检查main()
代码之后,我认为这MessageProducer
并不是真正的,Producer
因为该方法produce
实际上是produces
同时flushes
的。
但是,由于您似乎需要getProducer(producerName)
独立对待从相同方式获得的东西,那么您可以做的事情是这样的:
public class MessageProducer implements Producer<String> {
private boolean flushNeeded;
private String line;
public void produce(String data){
line =transformData(data)
flushNeeded = true;
flush();
}
public void flush(){
if (flushNeeded) {
sendDataToMessageQueue(line);
flushNeeded = false;
}
}
}
但是以我的拙见,将实现留空并没有什么显着的不同flush()
,如果不仅仅是为了使代码对读者更清晰一点(读空flush()
实际上可能会导致错误地认为你的实现永远不会刷新,而它做到了,但只是进入produce
方法)。
推荐阅读
- scala - 如何使用依赖路径的类型类
- azure-cosmosdb - What happens if I loop indefinitely in a stored procedure?
- algorithm - 你能说出这个音频压缩算法的名字吗?
- java - 在 Java 中将字符串解析为双精度时出错
- google-cloud-platform - Google Cloud Datastore - 插入一个请求后获取
- python-3.x - 无法使用 Python 和 Cerberus 验证重复值的列表
- dll - VS2019项目在运行时加载一个dll而不是使用静态库
- razor - 链接在本地索引页面上有效,但在部署时无效
- mysql - 命令跟踪用户回滚并查看哪个用户正在提交最大手动回滚
- c# - 如何为 ASP.NET core 2.1 项目启用外部连接?