WEB开发网
开发学院软件开发Java 演化架构与紧急设计: 语言、表达性与设计:第 2 部... 阅读

演化架构与紧急设计: 语言、表达性与设计:第 2 部分

 2009-11-05 00:00:00 来源:WEB开发网   
核心提示: ArrayList.metaClass.getFirst{delegate.size>0?get(0):null}ArrayList.metaClass.getLast{delegate.size>0?get(delegate.size-1):null}ArrayListl=newA

ArrayList.metaClass.getFirst { 
 delegate.size > 0 ? get(0) : null 
} 
 
ArrayList.metaClass.getLast { 
 delegate.size > 0 ? get(delegate.size - 1) : null 
} 
 
ArrayList l = new ArrayList() 
l << 1 << 2 << 3 
println l.first 
println l.last 
 
ArrayList emptyList = new ArrayList() 
println emptyList.first 
println emptyList.last 

使用 ExpandoMetaClass,您可以为类定义一些新的属性(使用熟悉的 Java get/set 命名模式)。为类定义了新的属性之后,可以将它们像普通属性一样调用。

您可以像在 JRuby 中一样使用已有的 JDK 类实现相同的目的,如清单 6 所示:


清单 6. 使用 JRuby 为 ArrayList 添加方法

require 'java' 
include_class 'java.util.ArrayList' 
 
class ArrayList 
 def first 
  size != 0 ? get(0) : nil 
 end 
 
 def last 
  size != 0 ? get(size - 1) : nil 
 end 
end 
 
 
list = ArrayList.new 
l << 1 << 2 << 3 
puts list.first 
puts list.last 
 
empty_list = ArrayList.new 
puts empty_list.first 
puts empty_list.last 

不要错误地认为每个问题的解决方案都需要更多的类。元编程通常能提供更加简洁的解决方案。

带调用钩子的修饰符

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

Tags:演化 架构 紧急

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