























最近在与Ninputer争执.NET与Java的泛型特点,他的意见是.NET的Generics要更强(实现层面与语法层面两个层面),我的意见是Java的Generics的语法层面要更强(语法层面的强主要是指易用性)。他让我看了一篇用.NET Generics实现的Abstract Factory的文章http://blog.joycode.com/ninputer/archive/2006/01/12/70313.aspx,说如果用Java就会遇到很多麻烦。因为我也是初学Java的Generics,所以比较感兴趣这个话题,看了一下文章后做了一些实现后得出了以下一些结论。
该不该使用Generics实现Abstract Factory?
我的意见是不应该,理由如下:
Java的泛型真的那么弱吗?如果要实现定量的Abstract Factory真的很难吗?
我的答案是否,实际上,我觉得用Java的语法无论在实现上的阅读与易用性都要比.NET的语法强。下面是我给出的Abstract Factory的实现,虽然我说过,用Generics实现Abstract Factory并不合适。
interface Processor {}
interface Ram {}
class PentiumProcessor implements Processor {}
class DDRRam implements Ram {}
interface AbstractFactory<PA, PB> {
PA createA();
PB createB();
}
class IntelFactory implements AbstractFactory<PentiumProcessor, DDRRam> {
public PentiumProcessor createA() {
// 一切特化且可在这里实现。
return new PentiumProcessor();
}
public DDRRam createB() {
// 一切特化且可在这里实现。
return new DDRRam();
}
}
// 使用
AbstractFactory<? extends Processor, ? extends Ram> factory =
new IntelFactory();
Processor processor = factory.createA();
Ram ram = factory.createB();
以上代码并没有运用不必要的TypeToken,而且也没有实例化时特化的问题,但是仍然没有解决Abstract Factory的量的问题。可以看出,这段代码非常的简洁,我觉得这段代码真正突出了Generics的优点:泛化类型,而没有做不应该做的过多的事情(比如泛化本来应该是特化的东西)。
注意Java的Generics语法是可以使用wildcard的(?),这是.NET所没有的。wildcard的特点之一就是能够在变量声明中使用,这是很重要的一大特色。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。