结合通用边界一个反模式?

时间:2008-11-26 10:17:14

标签: java generics interface anti-patterns

作为对previous question的跟进 具有组合通用边界的函数,例如:

<T extends Foo & Bar> void doStuff(T argument) {
  //do stuff wich should only be done if arguments is both foo and bar
}

因为这不能从未指定的对象转换,所以您需要了解实际实现这些接口的某个对象。在我看来,需要知道传递给doStuff(T a)的对象参数的具体类型是违反德米特定律的。

该函数没有指定需要知道实际的类(可能有许多不同的类),我真的不想知道它,因为知道这个类增加了我的代码库中的依赖。

使用这些边界的反模式?如果是这样,最好如何避免它?

案例场景涉及一个接口,指定对象是持久的,另一个指定对象具有相关实体。在这种情况下,doStuff(T a)函数在持久化时保留了相关实体。但是,非持久性实体也可以拥有相关实体,但不应由doStuff(T a)函数

处理

3 个答案:

答案 0 :(得分:3)

我不会将组合泛型边界视为反模式。至少我的代码中有一些用途。例如,以下示例代码使用Comparable接口中的compareTo查找集合中的最大Number实例:

<T extends Number & Comparable<T>> T max(Collection<T> numbers)

答案 1 :(得分:1)

  

在我看来,需要知道传递给doStuff(T a)的对象参数的特定类型是违反Demeter定律的

我不同意。我不知道如何

T<? extends Foo & Bar> void doStuff(T argument) 

需要更多的参数知识才能通过

T<? extends Foo> void doStuff(T argument) 

甚至更多只是

void doStuff(T argument) 

在所有情况下,你需要了解一些关于论证的事情,我不认为第一个案例要求更多的知识,因为它有两个标识符。

答案 2 :(得分:0)

反模式正在铸造。

然而,花哨的泛型步法可能会让非高级程序员感到困惑。这些类型和方法的使用应该比它们的实现容易得多。