代码之家  ›  专栏  ›  技术社区  ›  Pablo Fernandez

groovy expando元类

  •  3
  • Pablo Fernandez  · 技术社区  · 15 年前

    我开发了一个类,它有一些方法来增加整数,它主要让我这样做:

    def total = 100.dollars + 50.euros
    

    现在我必须扩展integer.metaclass,这样做:

    Integer.metaClass.getDollars = {->
        Money.Dollar(delegate)
    }
    

    我试着把它放在文件的底部,在money类声明之前,但是编译器说一个名为money的类已经存在,我知道为什么会发生这种情况(因为groovy用一个空的静态void main创建一个文件名为的类来运行这段代码)。

    我还尝试在类中使用静态块,如下所示:

    static {
        Integer.metaClass.getDollars = {->
            Money.Dollar(delegate)
        }
    }
    

    这两个都不起作用。

    第三种解决方案是更改文件名(如moneyClass.groovy)并保留类名(class money),但这看起来有点奇怪。

    还有什么我能做的吗?谢谢。

    1 回复  |  直到 15 年前
        1
  •  2
  •   Arne Burmeister    15 年前

    public class TypeEnhancer {
      public void start() {
        Integer.metaClass.getDollars() = {-> Money.Dollar(delegate) }
      }
    
      public void stop() {
        Integer.metaClass = null
      }
    }
    

    new TypeEnhancer().start(); new TypeEnhancer().stop();

    推荐文章