groovy没有通过字段语法识别java getters / setter

时间:2015-01-03 17:54:17

标签: groovy

我在java中定义了以下继承层次结构。

public class BaseModel extends HashMap<String, Object> { 
    public String getString(String key) { 
        return (String)this.getOrDefault(key, "EMPTY"); 
    } 

} 

public class Entity extends BaseModel { 

    private String id; 
    private String name; 

    public String getName() { 
        return name; 
    } 

    public void setName(String name) { 
        this.name = name; 
    } 

    public String getId() { 
        return id; 
    } 

    public void setId(String id) { 
        this.id = id; 
    } 
} 

现在在一个groovy脚本中,我尝试执行以下操作:

Entity entity = new Entity(); 
entity.id = "101"; 
entity.name = "Apple"

和“id”和“name”无法识别。有趣的是,如果我执行以下操作之一,它们就会被识别出来:

  1. 不从BaseModel继承实体
  2. 不是从HashMap继承BaseModel,而是让HashMap成为BaseModel的数据成员
  3. 直接从HashMap继承实体
  4. 起初我认为groovy因为扩展HashMap而无法识别“id”和“name”语法,但上面的#3证明这是不正确的。我很难过为什么在这一点上没有被认出来。有人可以帮我吗?复制粘贴应该很容易,并自己尝试一下。

2 个答案:

答案 0 :(得分:0)

问题似乎是实体类中的setter和getter,groovy中的所有内容都是公共的,它会创建所有getter和setter方法。

我测试了groovy控制台中的下一个代码并且它有效。

public class BaseModel extends HashMap<String, Object> { 
    public String getString(String key) { 
        return (String)this.getOrDefault(key, "EMPTY"); 
    } 

} 

public class Entity extends BaseModel { 

    private String id; 
    private String name; 
} 

Entity entity = new Entity(); 
entity.id = "101"; 
entity.name = "Apple"

println entity.id

它在groovyConsole输出屏幕中打印101。

答案 1 :(得分:0)

当Entity从BaseModel或直接从HashMap扩展时,Entity将成为Map。所以,当我们说entity.id时,Groovy试图在地图中找到一个键为'id'的条目。由于没有这样的条目,它打印出null。

public class Entity extends HashMap<String, String> {

    private String id;
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }
}

Entity entity = new Entity();
entity.id = "101";
entity.name = "Apple"

println entity.id   //prints null

但是当Entity不再从BaseModel扩展时,entity.id将被解释为Entity的成员。

public class Entity  {

    private String id;
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }
}

Entity entity = new Entity();
entity.id = "101";
entity.name = "Apple"

println entity.id  //prints 101