使用泛型接口及其实现的最佳方法

v7pvogib  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(386)

我有一个接口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是否符合最佳开发实践,我认为不是,因为我们使用具体类型作为参考变量?
选项2看起来很合适,但在这里我必须再次声明类型(customobject),我觉得这是额外的负担,因为messagehandlerimpl已经这样做了,我遗漏了什么吗?

x0fgdtte

x0fgdtte1#

泛型在这里无关紧要。通常使用与选择适当的声明变量类型相同的准则。
更广泛地说,你打电话的设计很差 new 完全。相反,让 handler 构造函数参数。在这种情况下,一定要使用超类型 MessageHandler<CustomObject> (或者,更好的是, MessageHandler<? super CustomObject> 甚至 Consumer<? super CustomObject> ).

相关问题