Groovy, расширенный метакласс - PullRequest
3 голосов
/ 24 апреля 2009

Я разработал класс, в котором есть несколько методов, которые расширяют Integer, в основном он позволяет мне делать это:

def total = 100.dollars + 50.euros

Теперь я должен расширить Integer.metaClass, выполнив что-то вроде этого:

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

Я пытался поместить это в конец файла, перед объявлением класса Money, но компилятор говорит, что класс Named Money уже существует, я знаю, почему это происходит (потому что groovy создает класс с именем файла с пустой статический void main для запуска этого кода).

Я также пытался использовать статический блок внутри класса следующим образом:

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

Это тоже не работает.

Третьим решением было бы изменить имя файла (например, MoneyClass.groovy) и сохранить имя класса (класс Money), но это кажется немного странным.

Есть ли что-нибудь еще, что я могу сделать? Спасибо.

1 Ответ

2 голосов
/ 25 апреля 2009

Просто поместите его в любой метод любого класса, например, 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();. Боб также может использоваться в качестве бобов Spring.

...