作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有如下界面
public interface Splitter<T, V> {
V[] split(T arg);
}
以下是我用来获取 Splitter 实现的工厂方法实现。
工厂方法实现
public static <T, V> Splitter<T, V> getSplitter(Class<T> key1, Class<V> key2) {
if (key1 == Company.class && key2 == Department.class)
return (Splitter<T, V>) new CompanySplitterImpl();
// more cases
}
以下是我在客户端的调用,编译正常
Splitter<Company, Department> split = getSplitter(Company.class, Department.class);
我想避免客户端代码与实现紧密耦合。有没有办法避免硬编码类型参数,即避免在被调用方使用公司和部门(Splitter<Company, Department>
)并改用一些变量?有没有办法从一些外部属性文件中加载它们?
仅供引用:我不确定它在 Java 中的可行性?
最佳答案
您可以做的一件事是让您的工厂对具体实现一无所知,而是让自己注册(或包含预定义列表)并询问每个实现是否可以处理这些类型。例如,给定一个像上面示例一样的预定义列表:
public class SplitterFactory {
private Set<Splitter> splitters = new HashSet<>() {{
add(new CompanySplitterImpl());
}};
public static <T, V> Splitter<T, V> getSplitter(Class<T> key1, Class<V> key2)
{
for (Splitter splitter : splitters) {
if (splitter.canAccept(key1, key2)) {
return splitter;
}
// no matched splitter
}
}
显然,这是一个非常幼稚的解决方案,您可以更有效地实现查找。如果您在编译时不知道您的类型,您还可以通过工厂注册机制在运行时包含新类型。因为 Splitter 本身现在负责报告它可以处理的类型,所以它是完全可扩展的。
关于java - 如何在 java 中使菱形运算符类型参数动态化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29715396/
我是一名优秀的程序员,十分优秀!