Why Java Sucks and C# Rocks(3):Attribute与Annotation
2010-05-04 00:00:00 来源:WEB开发网在Java语言中,事实上我们也可以修改RegexValidation类,让开发人员可以通过这种方式来使用:
@RegexValidation("^\\w+@[a-zA-Z_]+?\\.[a-zA-Z]{2,3}$")
只要我们可以把RegexValidation改成这样即可:
public @interface RegexValidation {
String value();
}
在Java语言中,假如Attribute的一个成员名为value,且没有其他成员(或是其他成员都提供了默认值),那么便可以如C#中构造函数般使用。那么……
如果我想使用“构造函数”的方式传递数据,但成员名还是想用pattern,可以吗?
如果我想使用“构造函数”的方式传递多个参数,可以吗?
不可以。我也不知道为什么会有这种特别的约定规则呢?可能和Annotation是接口有关吧。接口没有构造函数,因此没有一个合适的方式以省去成员名的方式传递参数,只能指定一个特别的名称了——但对于开发人员来说,凭什么我的Regex值一定要叫value而不能叫pattern呢?
Java 5.0学习C#
我不知道为什么有了C#的优秀榜样,Java 5.0却还是不愿意做的更好。其实C#中的Attribute也有缺点,例如无法使用泛型,所以Java完全有胜过C#的机会。其实在以后的文章中您也可以发现这样一个现象:C#的榜样并不完美,但Java的进化更为糟糕。对此,我们除了一声长叹又能怎么办呢?
除了Annotation之外,Java 5.0还从C#处学习了以下功能:
可以使用enum关键字定义强类型的常量——C# 1.0中也有类似功能(好吧,我承认,其实Java的enum功能比C#中要丰富一些)。
可变参数,即可以使用“一一列举”形式,提供某个方法最后一个数组参数的内容——其实就是C# 1.0中的params。
增强了for的能力,可以方便地使用枚举器(Iterator)——这其实就是C# 1.0中的foreach。
那么,到底是谁是所谓的“copy cat”呢?就像我在第一篇文章中写的那样,“自从C# 1.0诞生之日起,就只出现Java借鉴C#特性的情况,至今已将近10年”,以后我们还可以看到更多例子。我并不想说所谓的“抄袭”,我只想说“学习” 或是“借鉴”。我认为,只要是优点,出现雷同这都是完全正常且值得鼓励的。我现在提到这些,主要的目的是想告诉那些固执地认为“C#只是Java的山寨复制品”的同学们一个事实。
更多精彩
赞助商链接