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开发网   
核心提示: [Range(10,60)]当然,有人说这种做法不如显式指定Min和Max来的清晰——可能是这样吧,Why Java Sucks and C# Rocks(3):Attribute与Annotation(6),但是在很多时候通过构造函数传参也有优势,例如我们可以重新定义之

[Range(10, 60)]

当然,有人说这种做法不如显式指定Min和Max来的清晰——可能是这样吧,但是在很多时候通过构造函数传参也有优势,例如我们可以重新定义之前的RegexAttribute为:

public class RegexAttribute : ValidationAttribute 
{ 
  public RegexAttribute(string pattern) 
  { 
    this.Pattern = pattern; 
  } 
 
  public string Pattern { get; private set; } 
 
  ... 
}

在这里我们为RegexAttribute提供了一个接收pattern的构造函数,并将Pattern属性的set方法设为private。于是我们便可以这样使用RegexAttribute了:

[Regex(@"^\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,3}$")]

这么做有两个好处:首先,外部无法设置Pattern属性的值,这点加强了对象的封装性。其次,这里相当于强制RegexAttribute在使用时必须提供一个pattern参数(虽然无法进行验证)。这样,代码在使用时既显得优雅,可读性也非常良好。但其实,我认为更关键的是,这种使用模式和创建一个对象,并为其属性进行赋值一样:我们可以选择任意的构造函数创建对象,再“有选择地”进行属性赋值。例如上文AttributeUsage的使用:

[AttributeUsage(AttributeTargets.Property, AllowMultiple = true)]

这里的含义是,创建一个AttributeUsageAttribute类,提供AttributeTargets.Property作为构造函数的参数,并同时将AllowMultiple属性设为true。可见,这种做法给了我们相当自由性——而且非常自然,没有奇怪约定。在设计一个 Attribute的时候,我们一般可以提供几个常用的构造函数,在大部分情况下使用这些构造函数也已经足够了。除此之外,Attribute对象的属性包含了默认值,在必要的时候可以进行修改。

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

Tags:Why Java Sucks

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