2009-04-24 2 views
3

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

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

Dang! Мне нужно научиться Groovy. – bgw

ответ

2

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

+0

спасибо, но я бы предпочел не называть какой-либо странный метод для инициализации моих расширений. Кроме того, metaClass = null может создавать ошибки позже (groovy использует поле metaClass internaly). –

+0

metaClass = null - рекомендуемый подход для удаления всех расширений, как говорит Гийом Лафордж две недели назад, когда я встретил его. –

Смежные вопросы