有一个Groovy等价于Gradle findProperty吗?

有一个Groovy等价于Gradle findProperty吗?,groovy,Groovy,我正在寻找一种方法,以避免首先使用hasProperty()检查属性 理想的情况下,我想要像 def a = myobj.getPropertyOrElse("mypropname", "defaultvalueifpropertymissing') 我看到gradle有一个findProperty(),但对于普通groovy我找不到类似的东西 我能想到的最短版本是 def a = if (a.hasProperty("mypropname")) a.getProperty("mypropna

我正在寻找一种方法,以避免首先使用
hasProperty()
检查属性

理想的情况下,我想要像

def a = myobj.getPropertyOrElse("mypropname", "defaultvalueifpropertymissing')

我看到gradle有一个
findProperty()
,但对于普通groovy我找不到类似的东西

我能想到的最短版本是

def a = if (a.hasProperty("mypropname")) a.getProperty("mypropname") else "defaultvalueifmissing"
这显然会重复属性名称两次。创建自己的方法是可能的,但仅限于当前类

class MyClass {
    String name = "the name"
}

def a = new MyClass()

def getProperty(Object theInstance, String propName, Object defaultValue) {
  if (theInstance.hasProperty(propName)) theInstance.getProperty(propName) else defaultValue
}

assert "the name" == getProperty(a, "name", "")
assert "default value" == getProperty(a, "method", "default value")

我能想到的最短版本是

def a = if (a.hasProperty("mypropname")) a.getProperty("mypropname") else "defaultvalueifmissing"
这显然会重复属性名称两次。创建自己的方法是可能的,但仅限于当前类

class MyClass {
    String name = "the name"
}

def a = new MyClass()

def getProperty(Object theInstance, String propName, Object defaultValue) {
  if (theInstance.hasProperty(propName)) theInstance.getProperty(propName) else defaultValue
}

assert "the name" == getProperty(a, "name", "")
assert "default value" == getProperty(a, "method", "default value")

hasProperty
方法返回一个
MetaProperty
实例,您可以使用该实例通过传递原始实例来检索值:

def a = myobj.hasProperty('mypropname')?.getProperty(myobj) ?: 
    'defaultvalueifpropertymissing'

然后使用安全导航操作符(
?。
)和Elvis操作符(
?:
)避免使用
if/else

hasProperty
方法返回一个
元属性
实例,您可以通过传递原始实例来检索该值:

def a = myobj.hasProperty('mypropname')?.getProperty(myobj) ?: 
    'defaultvalueifpropertymissing'

然后使用安全导航操作符(
?。
)和Elvis操作符(
?:
)避免出现
if/else

可以使用的
getProperties()
getProperty()


您可以使用以下各项的
getProperties()
getProperty()


我在这个问题中添加了一个
getPropertyOrElse
的实现(由于重复,我认为这是一个合适的地方)-这个问题明确地要求一个解决方案来检查属性是否存在,这正是我试图避免的。我在问是否有一种方便的方法/语法可以避免显式检查。仅供参考,地图会将其放在表上,并且有
withDefault
-这个问题明确要求解决方案来检查属性是否存在,这正是我试图避免的。我想问的是,是否有一种方便的方法/语法可以避免显式检查。仅供参考,映射将其放在表上,并使用默认值
这是一种改进,尽管重复myobj仍然困扰着我,但它比重复属性名要好。这是一种改进,尽管重复myobj仍然困扰着我,但这比重复属性名要好