Продолжая эту запись в блоге, я пытаюсь используйте категорию для создания простого DSL для использования с классами javax.measure
(JSR-275) (аналогично TimeCategory для временных интервалов)
Однако я не хочу добавлять шаблонный код для каждого из возможных доступных методов (getMeter, getMilliMeter, getKelvin, getSecond и т. д.). Я думал, что переопределение метода getProperty(String)
сработает, но, увы, похоже, что метод getProperty
, определенный в категории, не используется при прямом доступе к свойству.
Вот некоторый упрощенный код для демонстрации: import javax.measure.quantity.Length; импортировать javax.measure.unit.Unit; импортировать javax.measure.Measure;
@Category(Number)
class LengthCategory {
public Measure<BigDecimal, Length> getProperty(String unit){
return Measure.valueOf(this,Unit.valueOf(unit));
}
}
use(LengthCategory){
println 3.getProperty("m") // this works
println 3.m // this reports a non-exisiting property
prinlln 3.'m' // as does this
}
Предполагая, что другие методы динамического добавления свойств к объекту среды выполнения (например, Expando
, создание подклассов GroovyInterceptible
, примеси и другие манипуляции с метаклассами) нежизнеспособны, и мне бы действительно не пришлось вручную кодировать геттеры для каждой возможной комбинации единиц и префиксов SI. Очевидно, есть и другие способы создания DSL для измерений, но мне все же хотелось бы понять, почему этот метод не работает.
Может ли кто-нибудь объяснить, почему метод getProperty
категории не переопределяет использование .propertyName
? Я явно упускаю что-то важное в разрешении имен свойств с использованием метакласса во время выполнения.