作为我的上一个问题的后续
拥有一个具有组合通用边界的函数,例如:
<T extends Foo & Bar> void doStuff(T argument) {
//do stuff which should only be done if arguments is both foo and bar
}
因为这不能从未指定的对象进行转换,所以您需要了解实际实现这些接口的某个对象。在我看来,需要知道传递给
doStuff(T a)
的对象参数的具体类型违反了德米特定律。
该函数没有指定需要了解实际的类(可能有很多不同的类),而且我真的不想知道它,因为了解这个类会增加我的代码库中的依赖性。
使用这些边界是反模式吗?如果是这样,应该如何最好地避免它?
该案例场景涉及一个接口,指定对象是持久的,而另一个指定对象具有相关实体。本例中的
doStuff(T a)
函数在持久化相关实体时对其进行持久化。然而,非持久实体也可以有相关实体,但不应该由 doStuff(T a)
函数处理
我不认为组合通用边界是反模式。至少我在我的代码中对它们有一些用途。例如,以下示例代码使用 Comparable 接口中的 CompareTo 查找集合中最大的 Number 实例:
<T extends Number & Comparable<T>> T max(Collection<T> numbers)
在我看来,需要知道传递给 doStuff(T a) 的对象参数的具体类型违反了德米特定律
我不同意。我不明白如何
T<? extends Foo & Bar> void doStuff(T argument)
需要更多的论证知识才能通过
T<? extends Foo> void doStuff(T argument)
甚至更多
void doStuff(T argument)
在所有情况下,你都需要了解一些关于论证的知识,我认为第一种情况不需要比其他情况更多的知识,因为它有两个标识符。
反模式正在铸造。
但是,花哨的泛型步骤可能会让非高级程序员感到困惑。使用这样的类型和方法应该比它们的实现容易得多。