java - 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 是否良好,我认为不是,因为我们使用具体类型作为参考变量?
- Option-2 看起来很合适,但在这里我必须再次声明类型(CustomObject),我觉得这是额外的包袱,因为 MessageHandlerImpl 已经这样做了,我错过了什么吗?
解决方案
泛型在这里无关紧要。使用通常用于选择适当声明变量类型的相同准则。
更广泛地说,您根本没有调用new
. 相反,制作handler
一个构造函数参数。在这种情况下,一定要使用超类型MessageHandler<CustomObject>
(或者,甚至更好,MessageHandler<? super CustomObject>
甚至 Consumer<? super CustomObject>
)。
推荐阅读
- python - 字符串中的递增数字 + 1
- c# - 需要 ASP.NET MVC 创建视图页面以将用户提供的信息更改为外键值
- amazon-web-services - 如何在管道堆栈创建中存储和使用参数以供以后创建无服务器堆栈
- mysql - 如何在一定数量的表中获取所有出现的外键?
- android - 我无法在通知中添加自定义声音
- laravel - 如何根据父类型关系的值将 eloquent 模型变形或强制转换为其中一个子模型
- java - ExoPlayer:不推荐使用 setNotificationListener
- azure - 如何通过日志文件的大小或日期格式限制 azure blob 日志记录
- postgresql - 为什么我的 db/structure.sql 文件在运行 db:structure:dump 后包含 CREATE SCHEMA 语句?
- java - 无法在android中单击按钮时显示textview