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开发网   
核心提示: 简而言之,大部分xUnit框架都是简单地移植JUnit的代码,Why Java Sucks and C# Rocks(3):Attribute与Annotation(2),但是NUnit却利用了C#的Attribute提供了更优雅的设计,类似的观点在Martin Fowler所编的杂志中也有过更

简而言之,大部分xUnit框架都是简单地移植JUnit的代码,但是NUnit却利用了C#的Attribute提供了更优雅的设计,类似的观点在Martin Fowler所编的杂志中也有过更为具体的论述。因此,C#在这方面可谓大大领先于Java 1.4。幸运的是,在C#发布两年后Java语言也推出了5.0版本,增加了Annotation功能,这无疑缩小了与C#之间的差距。

只可惜,Java语言中的Annotation功能,我认为相对于C#语言的Attribute功能至少有两个缺点。

缺点1:失血模型

说起C#的Attribute与Java的Annotation,两者最大的区别便是:C#中的Attribute是类,而Java中的Annotation是接口。

由于C#的Attribute其实也是.NET中标准的“类”,因此与类有关的设计方式都可以运用其中,例如抽象类,抽象方法,重载方法,也可以实现接口等等。这类特性造就了一些非常常用的设计模式,例如可能对于大部分.NET程序员都非常熟悉的“验证标记”。

简单地说,这是一种通过标记来表示“验证逻辑”的做法,例如我们可以先定义一个基类:

public class ValidationResult { ... } 
 
[AttributeUsage(AttributeTargets.Property, AllowMultiple = true)] 
public abstract class ValidationAttribute : Attribute 
{ 
  public abstract ValidationResult Validate(object value); 
}

ValidationAttribute类继承了System.Attribute,也就是说,它可以作为其他Attribute的基类。例如,我们可以定义这样一些通用的验证类:

public class RangeAttribute : ValidationAttribute 
{ 
  public int Min { get; set; } 
 
  public int Max { get; set; } 
 
  public override ValidationResult Validate(object value) { ... } 
} 
 
public class RegexAttribute : ValidationAttribute 
{ 
  public string Pattern { get; set; } 
 
  public override ValidationResult Validate(object value) { ... } 
}

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

Tags:Why Java Sucks

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