我有一个接口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已经这样做了,我遗漏了什么吗?
1条答案
按热度按时间x0fgdtte1#
泛型在这里无关紧要。通常使用与选择适当的声明变量类型相同的准则。
更广泛地说,你打电话的设计很差
new
完全。相反,让handler
构造函数参数。在这种情况下,一定要使用超类型MessageHandler<CustomObject>
(或者,更好的是,MessageHandler<? super CustomObject>
甚至Consumer<? super CustomObject>
).