演化架构与紧急设计: 语言、表达性与设计:第 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
}
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
不要错误地认为每个问题的解决方案都需要更多的类。元编程通常能提供更加简洁的解决方案。
带调用钩子的修饰符
更多精彩
赞助商链接