WEB开发网
开发学院软件开发Java Why Java Sucks and C# Rocks(3):Attribute与A... 阅读

Why Java Sucks and C# Rocks(3):Attribute与Annotation

 2010-05-04 00:00:00 来源:WEB开发网   
核心提示: 而在Java 5.0中,似乎Annotation和C#的Attribute在表现形式上差不多,Why Java Sucks and C# Rocks(3):Attribute与Annotation(4),例如,我们也可以定义一些“验证标记”:public@interfac

而在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#般优雅,自然。

上一页  1 2 3 4 5 6 7  下一页

Tags:Why Java Sucks

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接