Groovy 扩展元类

发布于 2024-07-17 12:13:51 字数 625 浏览 6 评论 0原文

我开发了一个类,它有一些增强 Integer 的方法,它主要让我这样做:

def total = 100.dollars + 50.euros

现在我必须扩展 Integer.metaClass 做这样的事情:

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

我尝试将其放在文件的底部,在 Money 类声明之前,但是编译器说一个名为 Money 的类已经存在,我知道为什么会发生这种情况(因为 groovy 创建了一个具有空 static void main 的文件名的类来运行此代码)。

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

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

这都不起作用。

第三种解决方案是更改文件名(如 MoneyClass.groovy)并保留类名(class Money),但这似乎有点奇怪。

我还有什么可以做的吗? 谢谢。

I've developed a Class that has some methods that augment Integer, it mainly lets me do this:

def total = 100.dollars + 50.euros

Now I have to extend Integer.metaClass doing something like this:

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

I tried putting that at the bottom of the file, before the Money class declaration, but the compiler says that a class Named Money already exists, I know why it happens (because groovy creates a class with the name of the file with an empty static void main to run this code).

I also tried using a static block inside the class like this:

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

This neither works.

A third solution would be to change the file name (like MoneyClass.groovy) and keep the class name (class Money) but that seems a bit weird.

Is there anything else I can do? Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

哀由 2024-07-24 12:13:51

只需将其放入任何类的任何方法中(可能是一个 bean) TypeEnhancer.groovy:

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

  public void stop() {
    Integer.metaClass = null
  }
}

只需通过调用 start() 创建并初始化:new TypeEnhancer().start();
要禁用增强功能,请调用new TypeEnhancer().stop();。 该 bean 也可以用作 Spring bean。

Just put it in any method of any class maybe a bean TypeEnhancer.groovy:

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

  public void stop() {
    Integer.metaClass = null
  }
}

Just create and initalize by calling start(): new TypeEnhancer().start();.
To disable the enhancement, call new TypeEnhancer().stop();. The bean can also used as Spring bean.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文