当前位置: 首页 > 知识库问答 >
问题:

一个类不实现方法的接口

慕容灿
2023-03-14

我有一个生产者,它获取数据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();
    }
}

为了证明我的问题,想象一下我有像上面这样的制作人。一个加载所有数据,然后在完成后立即批量发送,第二个立即发送数据(因此它不批量发送数据,但每当有新数据时,createdit立即发送)

大多数生产者会在每加载一个数据之后发送数据,但很少有人会马上发送。如果生产者立即发送数据,则flush()方法将保持为空。然而,这似乎是一种糟糕的做法,可能违反了一些OOP原则。对此,正确的实施方式是什么?

谢谢你的回答!

共有1个答案

令狐弘益
2023-03-14

在我看来,并且在检查了main()代码之后,我认为MessageProducer并不是真正的生产者,因为Producer方法实际上是同时生成刷新

但是,由于您似乎需要以相同的方式独立地对待从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方法)。

 类似资料:
  • 本文向大家介绍C#判断一个类是否实现了某个接口3种实现方法,包括了C#判断一个类是否实现了某个接口3种实现方法的使用技巧和注意事项,需要的朋友参考一下 B为一个类,ISay为一个接口。 方法1: 方法2: 方法3:

  • 问题内容: 具有相同方法名称和签名的两个接口。但是由单个类实现,那么编译器将如何确定哪个方法用于哪个接口? 例如: 问题答案: 如果一个类型实现两个接口,并且每个接口定义一个具有相同签名的方法,则实际上只有一个方法,并且它们是不可区分的。例如,如果这两个方法的返回类型冲突,那么它将是编译错误。这是继承,方法重写,隐藏和声明的一般规则,并且不仅适用于两个继承的interface方法之间的可能冲突,还

  • 本文向大家介绍实现一个isNaN的方法相关面试题,主要包含被问及实现一个isNaN的方法时的应答技巧和注意事项,需要的朋友参考一下

  • 我有几个Java类,它们扩展了泛型列表接口的各种实现。它们只需记录添加到列表中的任何内容。 LoggingArrayList如下所示。顾名思义,它扩展了ArrayList。LoggingLinkedList类完全相同,只是它扩展了LinkedList。 我的主要目标是避免重复所有的公共代码,这样我就可以使用不同的基类。我在尽量坚持干巴巴的原则(不要重复你自己)。 首先,请不要建议更好的登录方式。那

  • 类具有可以是两种类类型之一的属性,这就是为什么我试图创建类类型实现的接口 所以我不能使用目标实体,因为这两个类都可以使用。下面是错误堆栈:org.hibernate。AnnotationException:model.User中的未知mappedBy。登录时,引用的属性未知:model.login.user。请帮帮我

  • 问题内容: 此代码完美地工作。方法test()适用于两个接口。幕后到底发生了什么?在实际情况下,此功能有何用处? 问题答案: 因为它是一个接口,所以不会造成任何危害。通过实现和,您基本上是在为您的课程使用蓝图。双方并说,应实施一个名为方法 您的类实现了该方法,因此接口已完成其工作。 基本上,您的班级在说:“哦,我需要因为接口而实现”,然后您就实现了。然后您的班级说:“哦,嘿,由于接口我需要再次实现