2012-10-17 5 views
29

मैं या तो अपेक्षित संपत्ति का मूल्य या निर्दिष्ट डिफ़ॉल्ट का उपयोग करना चाहता हूं। ग्रोवी में इसे कैसे प्राप्त किया जाए? उदाहरण कोकिसी ऑब्जेक्ट की कोई निश्चित संपत्ति होने पर सत्यापित कैसे करें?

आइए नज़र:

def printName(object) { 
    //if object has initialized property 'name' - print 'name', otherwise print ToString 
    if (object<some code here>name && object.name) { 
     print object.name 
    } else { 
     print object 
    } 
} 

उत्तर

57

आप hasProperty उपयोग कर सकते हैं। उदाहरण:

if (object.hasProperty('name') && object.name) { 
    println object.name 
} else { 
    println object 
} 

आप संपत्ति के नाम के लिए एक चर का उपयोग कर रहे हैं, तो आप इस का उपयोग कर सकते हैं:

String propName = 'name' 
if (object.hasProperty(propName) && object."$propName") { 
    ... 
} 
+0

+1 मेरा से बेहतर ... मुझे मेटा क्लास से शुरू नहीं होना चाहिए था ;-) –

+4

'# हैप्रोपर्टी 'वास्तव में एक [मेटाप्रोपर्टी] लौटाता है (http://groovy.codehaus.org/api/groovy/lang/MetaProperty .html), तो आप 'object.hasProperty (propName) जैसे कुछ भी कर सकते हैं? getProperty (ऑब्जेक्ट)?: defval' –

+1

... और groovyDoc (groovy-2.4.7) में कुछ असंगतता है: _Description_ '' 'लागू होने वाले रिटर्न के साथ शुरू होता है मेटाक्लास के पास दिए गए नाम ' ' _Returns_ के लिए खड़ा है' '' मेटाप्रोपर्टी या शून्य अगर यह मौजूद नहीं है, तो सत्य है –

6

मानते हुए अपने object एक ग्रूवी वर्ग, तुम इतनी तरह वस्तु metaClass में hasProperty का उपयोग कर सकते है:

def printName(o) { 
    if(o.metaClass.hasProperty(o, 'name') && o.name) { 
    println "Printing Name : $o.name" 
    } 
    else { 
    println o 
    } 
} 

तो, तो दिए गए दो वर्गों:

class Named { 
    String name 
    int age 

    String toString() { "toString Named:$name/$age" } 
} 

class Unnamed { 
    int age 

    String toString() { "toString Unnamed:$age" } 
} 

आप उदाहरण बना सकते हैं o उन्हें, और परीक्षण च:

def a = new Named(name: 'tim', age: 21) 
def b = new Unnamed(age: 32) 

printName(a) 
printName(b) 

कौन सा चाहिए उत्पादन:

Printing Name : tim 
toString Unnamed:32 
+1

धन्यवाद टिम, मैं क्यों और साधारण तरीके से नहीं हैं (यानी metaclass से वर्ग संपत्ति का उपयोग करने की क्या ज़रूरत है। object.hasProperty ('नाम'))? –

-2

मैं बस एक वस्तु कुछ संपत्ति है कि बात पर जोर देना चाहते हैं, मैं तो बस का परीक्षण निम्नलिखित:

assertNotNull(myObject.hasProperty('myProperty').name) 

तो myObjectmyProperty नहीं है अभिकथन एक नल पॉइंटर एक्सेप्शन साथ विफल हो जाएगा:

java.lang.NullPointerException: Cannot get property 'name' on null object 
1

आप मेटा प्रोग्रामिंग के माध्यम से अपने खुद के विधि लिख सकते हैं:

class Foo { 
    def name = "Mozart" 
} 

def f = new Foo() 

Object.metaClass.getPropertyOrElse = { prop, defaultVal -> 
    delegate.hasProperty(prop) ? delegate."${prop}" : defaultVal 
} 

assert "Mozart" == f.getPropertyOrElse("name", "") 
assert "Salzburg" == f.getPropertyOrElse("city", "Salzburg") 
संबंधित मुद्दे

 संबंधित मुद्दे