如何在Java中命名具有类似语义的类?

时间:2012-03-20 01:42:05

标签: java

例如,在C#中,FooFoo<T>Foo<T1, T2>可能具有相似的语义,但却是不同的类。但是在Java中,我无法命名那样的类。如何命名?我不认为FooFoo1<T>Foo2<T1, T2>是合适的。还有其他建议吗?

实际上,我想设计一些只有一个方法的接口,就像Runnable一样。但run中的Runnable没有返回值和任何参数。我想要像

这样的接口
public interface Runnable<T>{
    void run(T t);
}

public interface Runnable<T, TResult>{
    TResult run(T t);
}

public interface Runnable<T1, T2, TResult>{
    TResult run(T1 t1, T2 t2);
}

等等。我认为它们在同一个包装中更好。

2 个答案:

答案 0 :(得分:3)

您可以重命名它们以真正反映其功能:

BasicFoo
GenericFoo<T>
SuperDuperAdvancedFoo<T, U>

你甚至可以声明一个接口,比如Foo,它提供了Foo应该拥有的所有方法。然后在不同的Foos中使用不同的类型参数实现接口:

interface Foo<T, U>
BasicFoo implements Foo<Object, Object>
GenericFoo<T> implements Foo<T, Object>
SuperDuperAdvancedFoo<T, U> implements Foo<T, U>

编辑:在您的示例中工作,3个接口实际上只能使用其中一个声明:

public interface Runnable<T1, T2, TResult>{
    TResult run(T1 t1, T2 t2);
}

如果您不想要任何参数,只需在必要时提供Void。 Void类是不可实现的,因此唯一的另一种可能性是传递或返回null。例如:

public class MyRunnable implements Runnable<Void, Void, Void>;

创建一个类似于

的方法
void run();

你实际宣布了

Void run(Void a, Void b);

但是Void是不可实现的,所以你必须传递空值,函数将始终返回null。

答案 1 :(得分:1)

这是一些函数式编程库中的一个问题,它们具有不同arity函数的类。

guava仅通过支持单个参数来避免此问题 - 如果您想要多个args,则使用包装器。由于番石榴似乎对这么多,我怀疑这是最好的答案:不要这样做。

但是functional java使用F1,F2,...所以如果你走这条路,你就不会孤单。 bolts类似,但fun4j通过使用没有泛型的varags来避免此问题。

我知道我的回复可能看起来很狂热,但番石榴人花了很多时间worrying关于如何以适当的方式将东西融入java中;我打赌他们考虑并放弃了编号方法。