我试图建立一个具有属性的Groovy类,并使一个属性相互依赖。但我似乎总是得到一个null或默认值。我尝试使用'this'关键字,但缺少基本内容。我知道它可能与实例变量有关。
说我有以下几点:
class BaseClass {
String jobName
String jobDescription = jobName + '-description'
}
如果我实例化该类并声明两个属性,则一切正常:
new BaseClass().with {
jobName = 'test-job'
jobDescription = 'Sample description'
}
```
但是,如果仅实例化jobName属性,则说明将使用null。因此它将是“空描述”。
有什么方法可以实例化对象并使用jobName属性,这样我就不必为创建的每个对象重复自己的工作?
问题来源:Stack Overflow
我认为最好是覆盖设置器jobName,然后防御地设置描述。例如
class BaseClass {
String jobName
String jobDescription
void setJobName(String jobName) {
this.jobName = jobName
if (!jobDescription) {
jobDescription = "${jobName}-description"
}
}
}
assert new BaseClass().tap{ jobName = 'test-job' }.jobDescription == 'test-job-description'
您的尝试无法按预期进行的原因是由于事态发生-属性默认值是在对象的构造时完成的。因此,稍后设置作业(在中with)无效(不会从新输入中再次计算出该作业)。
另一个选择是基于构造函数的方法(例如,使用final并在c'tor中处理此问题以创建默认描述)
回答来源:Stack Overflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。