First they ignore you
then they ridicule you
then they fight you
then you win
    -- Mahatma Gandhi
Chinese => English     英文 => 中文             
随笔-179  评论-1027  文章-0  trackbacks-0
由于内部类存在语义缺陷,所以JCP决定将在Java7或Java8中添加对Closure的支持。而Groovy一开始就洞察到了这点,所以在Groovy中没有内部类,只有Closure,不过为了更好地兼容Java,将在未来的某个版本中支持内部类。现在让我们看看Groovy是如何满足Java开发人员对匿名类的需求的。

1,实现接口
interface  Talkable {
    
void  sayHello(String name)
}

def man 
=  [
    
//  实现接口
    sayHello:{String name  ->  println  " Hello, $name " }
] as Talkable

man.sayHello(
" Daniel " )
运行结果:
Hello, Daniel

2,继承抽象类
abstract class Human {
    
abstract void sayHello(String name)
}

def man 
= [
    
// 实现抽象方法
    sayHello:{String name -> println "Hello, $name"}
] as Human

man.sayHello(
"Daniel")
运行结果:
Hello, Daniel


其实说‘替代匿名类’有点不太贴切 :)

附:朝花夕拾——Groovy & Grails
posted on 2007-11-04 11:03 山风小子 阅读(1601) 评论(8)  编辑  收藏 所属分类: Groovy & Grails

评论:
# re: Groovy高效编程——用Closure替代匿名类 2007-11-04 18:09 | BeanSoft
以后有时间关注一下 呵呵  回复  更多评论
  
# re: Groovy高效编程——用Closure替代匿名类 2007-11-04 18:55 | 山风小子
@BeanSoft
嗯~随时欢迎您与我一同研究Groovy & Grails :)  回复  更多评论
  
# re: Groovy高效编程——用Closure替代匿名类 2007-11-05 09:21 | huangyifu
@山风小子

更详细的例子,请见paul king的回复.能否帮忙看看参数化(generic)的接口实现是否支持?谢谢.
http://www.nabble.com/how-to-new-instance-of-abstract-class-and-interface-like-java--tf4741534.html#a13570603  回复  更多评论
  
# re: Groovy高效编程——用Closure替代匿名类 2007-11-18 11:18 | fireflyc
map~?~!
map~~!~~?  回复  更多评论
  
# re: Groovy高效编程——用Closure替代匿名类 2007-11-18 11:21 | 山风小子
@fireflyc
[
// 实现接口
sayHello:{String name -> println " Hello, $name " }
]
是map :)

我关注的是{String name -> println " Hello, $name " }  回复  更多评论
  
# re: Groovy高效编程——用Closure替代匿名类 2007-12-23 15:31 | CD
谢谢博主的文章, 帮助很大. 不过我还有很多疑问, 不知道能否帮忙解答-_-!

闭包替换内部类的解释貌似很少, 依照着官方给的示例可以写出以下的代码:
//给button添加事件
button.actionPerformed = {println ("111111")}
button.actionPerformed = {println ("222222")}

这个语法是会用了, 不过不明白它是怎么工作的. 为什么第二条语句不会覆盖掉第一条, 而是变为添加? Groovy在其中做了什么?

第二个疑惑就是怎么给swing下的Timer初始化, 因为它需要用一个ActionListener初始化, 按照上面的方法是无从下手的. 看过博主的文章之后也会用了. 不过还是不明白其中Groovy做了什么. 到底是怎么把map转换为类或实现的?   回复  更多评论
  
# re: Groovy高效编程——用Closure替代匿名类 2007-12-23 17:08 | CD
重新描述一下第二个问题.
刚才测试了一下, 发现如果:
[1,2,3] as abclass
把数组转换为某个类实例的话, 会用数组去调用该类的构造函数?

[abc:111, bbb:222] as abclass
如果把map转换为实例的话, 会用每个项去赋值该类的域?

不知道理解对不对? 哪里有关于AS关键字的详细说明?

至于第一个问题为什么是添加事件, 还搞不清楚..  回复  更多评论
  
# re: Groovy高效编程——用Closure替代匿名类 2007-12-23 17:13 | CD
刚才又试了一下
[1:1,2:2].class
的结果是null.
Groovy不是说所有都是对象么? 为什么map实例的对应class是null?
刚接触Groovy, 有很多比较小白的问题..  回复  更多评论
  


标题  
姓名  
主页
验证码 *  
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2007-11-04 11:50 编辑过