java - 在 Java 中避免泛型的冗余参数
问题描述
我正在为我的 JavaFX 应用程序创建一个帮助程序类,如下所示:
public class ViewHelper<T extends Parent, U extends Controller> {
private static final String FXML_EXTENSION = ".fxml";
private final Class<? extends Controller> clazz;
private FXMLLoader loader;
private T t;
public ViewHelper(Class<? extends Controller> clazz) throws IOException {
this.clazz = clazz;
this.load();
}
private void load() throws IOException {
this.loader = new FXMLLoader(fxmlUrl());
this.t = this.loader.load();
}
private URL fxmlUrl() {
return clazz.getResource(clazz.getSimpleName() + FXML_EXTENSION);
}
public T component() {
return t;
}
public U controller() {
return loader.getController();
}
}
用法是:
var viewHelper = new ViewHelper<BorderPane, MainController>(MainController.class);
BorderPane borderPane = viewHelper.component();
MainController mainController = viewHelper.controller();
它实际上有效并实现了我想要的。但是,看到我必须通过MainController
两次,而它们始终相同,这让我很恼火。没有实例表明它们不一样。在创建实例期间如何避免其中之一ViewHelper
?
代替:
var viewHelper = new ViewHelper<BorderPane, MainController>(MainController.class);
我更喜欢这样的东西:
var viewHelper = new ViewHelper<BorderPane>(MainController.class);
或者:
var viewHelper = new ViewHelper<BorderPane, MainController>();
谢谢你的帮助。
解决方案
您可以添加要调用的静态方法而不是构造函数。
public static <T extends Parent, U extends Controller> ViewHelper<T, U> of(Class<T> componentType, Class<U> controllerType) throws IOException {
return new ViewHelper<T, U>(controllerType);
}
然后你这样称呼它:
var viewHelper = ViewHelper.of(BorderPane.class, MainController.class);
推荐阅读
- reactjs - 每张卡片下的空白太多,使用 reactjs-social-embed
- amadeus - 使用 amadeus api 构建航班预订引擎时出现某些错误的说明
- java - 为了在 Android 10 及更高版本中保存 PDF 文件,我需要做什么?
- java - 在下一个 API 调用中使用 Spring WebClient 响应?
- apache - 无法从本地网络访问 Apache 虚拟主机
- flutter - 将简单字符串转换为列表
- python - 如何根据 interval_start 和 interval_end 在 pandas 或 numpy 中扩展以下数据帧
- neo4j - 将 FOREACH 中的 MERGE 与密码脚本中的事务相结合
- android - 颤振深度链接在真实设备上不起作用
- r - 在 df 的列中为每个组添加“总计”行