Why Java Sucks and C# Rocks(3):Attribute与Annotation
2010-05-04 00:00:00 来源:WEB开发网而在Java 5.0中,似乎Annotation和C#的Attribute在表现形式上差不多。例如,我们也可以定义一些“验证标记”:
public @interface RangeValidation {
int min();
int max();
}
public @interface RegexValidation {
String pattern();
}
使用时似乎也差不多:
public class Person {
@RangeValidation(min = 10, max = 60)
public int age;
@RegexValidation(pattern = "^\\w+@[a-zA-Z_]+?\\.[a-zA-Z]{2,3}$")
public String email;
}
与C#不同,Java的Annotation其实是接口,它默认实现类库中定义的java.lang.annotation.Annotation 接口,并且只能定义一些无参数的方法(不过可以指定默认值)——因为这些方法的作用其实只是类似于一些“字段”,只是用于保存数据,以便在程序中返回。这样看来,似乎和C#中没有区别,只是一个使用了“属性”,一个利用了“方法”而已,不是吗?
自然不是,区别很大。试想,现在如果您要编写一段代码来进行统一的验证,那么该怎么做?似乎没法做,因为在C#中我们可以通过统一的基类来获取所有表示验证的Attribute,然后调用定义在基类中的Validate方法。在Java语言中我们无法做到这点,因此如果要识别 RangeValidation,那么我们就必须独立准备一段逻辑,而要识别RegexValidation则又是另一段不同的方法。因为两者的“识别” 方式完全不同,因此我们无法使用相同的代码进行验证工作。
更关键的是,如果验证逻辑是由类库提供的,而开发人员想要补充额外的验证方式,那么该怎么做?我们可以提供自定义的Annotation,这很容易,那么识别这个Annotation的逻辑该如何交给类库呢?这个自然也有办法解决,但无论如何都会带来较多的代码量,且做不到C#般优雅,自然。
更多精彩
赞助商链接