首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用groovy类别添加动态属性

使用groovy类别添加动态属性
EN

Stack Overflow用户
提问于 2013-02-27 00:53:01
回答 3查看 843关注 0票数 5

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;

代码语言:javascript
复制
@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的使用吗?很明显,我遗漏了一些关于在运行时使用元类解析属性名称的重要内容。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-02-27 03:17:02

我不知道为什么getProperty不能处理类别。但您可以在它们上定义一个基本相同的get方法(我认为)。这是可行的:

代码语言:javascript
复制
@Category(Number)
class LengthCategory {      
    def get(String unit) {
        "$this $unit"
    }
}

use (LengthCategory) {
    println 3.m   // 3 m
    println 3.'m' // 3 m
}
票数 4
EN

Stack Overflow用户

发布于 2016-10-15 01:37:34

据我所知,您实际上不能使用Category扩展具有完整(即可读和可写)属性的整数--只能使用方法。

可以通过使用只读属性的方法版本来扩展Integer。您甚至可以通过包含一个set方法使其成为可写的。但是,除了在静态变量中存储传入的值之外,似乎没有其他方法,这最终会影响所有整数。

示例:

代码语言:javascript
复制
$ 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()。然而,我还没有研究过这一点,所以我不知道它是否会工作(只是一个想法)。

票数 0
EN

Stack Overflow用户

发布于 2016-10-28 20:23:18

很好的答案,但不确定,既然JSR-363已经是最终版本,你是否还想使用JSR-275?;-)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15094773

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档