在this blog post上进行扩展,我尝试使用一个类别来创建一个简单的javax.measure (JSR-275)类(类似于时间间隔的TimeCategory )
但是,我不想为每个可能的可用方法(getMeter、getMilliMeter、getKelvin、getSecond等)添加样板代码。我原以为重写getProperty(String)方法会起作用,但很遗憾,直接访问该属性时,似乎没有使用在该类别中定义的getProperty方法。
这里有一些简化的代码来演示:导入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前缀组合手动编写getter。显然,还有其他方法可以创建用于测量的DSL,但我仍然想了解为什么这种方法不起作用。
有人能解释一下为什么这个类别的getProperty方法不覆盖.propertyName的使用吗?很明显,我遗漏了一些关于在运行时使用元类解析属性名称的重要内容。
发布于 2013-02-27 03:17:02
我不知道为什么getProperty不能处理类别。但您可以在它们上定义一个基本相同的get方法(我认为)。这是可行的:
@Category(Number)
class LengthCategory {
def get(String unit) {
"$this $unit"
}
}
use (LengthCategory) {
println 3.m // 3 m
println 3.'m' // 3 m
}发布于 2016-10-15 01:37:34
据我所知,您实际上不能使用Category扩展具有完整(即可读和可写)属性的整数--只能使用方法。
可以通过使用只读属性的方法版本来扩展Integer。您甚至可以通过包含一个set方法使其成为可写的。但是,除了在静态变量中存储传入的值之外,似乎没有其他方法,这最终会影响所有整数。
示例:
$ cat catprop
#!/usr/local/bin/groovy
@Category(Integer)
class CatInteger {
private static String str = "default"
public static String setN(Integer i, String _str) { str = _str }
public static String getN(Integer i) { return str }
}
use (CatInteger) {
3.n = "333a"
println "3.n is " + 3.n
3.n = "333b"
println "3.n is " + 3.n
4.n = "444"
println "4.n is " + 4.n
println "3.n is " + 3.n
}
$ catprop
3.n is 333a
3.n is 333b
4.n is 444
3.n is 444
$请注意,在最后一行3.n中返回"444“,因为存储的字段是静态的。我认为可以使用私有HashMap并为访问的每个Integer存储一个值,但这太难看了。
另一种可能是使用MetaClass接口的getProperty()和setProperty()。然而,我还没有研究过这一点,所以我不知道它是否会工作(只是一个想法)。
发布于 2016-10-28 20:23:18
很好的答案,但不确定,既然JSR-363已经是最终版本,你是否还想使用JSR-275?;-)
https://stackoverflow.com/questions/15094773
复制相似问题