首页 > 解决方案 > Java 泛型 - 使用泛型接口及其实现的最佳方式

问题描述

我有一个接口 MessageHandler,它采用通用类型 T 和一个实现 MessageHandlerImpl,它在具体类型 CustomObject 上运行。然后我在另一个客户端类中使用它,如下所示:

public interface MessageHandler<T> { 

    void validate(T t);
    
    void process(T t);
    
    default void handle(T t) {
        validate(t);
        process(t);
    }
}

public class MessageHandlerImpl implements MessageHandler<CustomObject> {

    @Override
    public void validate(CustomObject message) {}
        
    @Override
    public void process(CustomObject message) {}
}

public class AnotherClientClass {
    
    //option - 1
    MessageHandlerImpl handler = new MessageHandlerImpl();
    //option - 2
    MessageHandler<CustomObject> handler = new MessageHandlerImpl();

    public void getMessage() {
        String messageStr = getMessageFromAnotherMethd();
        CustomObject messageObj = convertToCustomObject(messageStr);
        
        handler.handle(messageObj);
    }
}

我在这里有几个问题:

  1. 根据最佳开发实践,选项 1 是否良好,我认为不是,因为我们使用具体类型作为参考变量?
  2. Option-2 看起来很合适,但在这里我必须再次声明类型(CustomObject),我觉得这是额外的包袱,因为 MessageHandlerImpl 已经这样做了,我错过了什么吗?

标签: javagenerics

解决方案


泛型在这里无关紧要。使用通常用于选择适当声明变量类型的相同准则。

更广泛地说,您根本没有调用new. 相反,制作handler一个构造函数参数。在这种情况下,一定要使用超类型MessageHandler<CustomObject>(或者,甚至更好,MessageHandler<? super CustomObject> 甚至 Consumer<? super CustomObject>)。


推荐阅读