groovy

2013-08-01 6 views
15

में डिफ़ॉल्ट मानों के साथ पैरामीटर नामित किया गया है क्या यह groovy में डिफ़ॉल्ट मानों के साथ पैरामीटर नामित करना संभव है? मेरी योजना एक प्रकार का ऑब्जेक्ट फैक्ट्री बनाना है, जिसे डिफ़ॉल्ट मानों के साथ ऑब्जेक्ट प्राप्त करने के लिए बिल्कुल कोई तर्क नहीं कहा जा सकता है। साथ ही, मुझे ऑब्जेक्ट के लिए किसी भी पैरा को स्पष्ट रूप से सेट करने की कार्यक्षमता की आवश्यकता होगी। मेरा मानना ​​है कि उदाहरण के लिए, पायथन कीवर्ड तर्कों के साथ यह संभव है।groovy

कोड मैं अभी के साथ प्रयास कर रहा हूँ की तरह

नीचे
// Factory method 
def createFoo(name='John Doe', age=51, address='High Street 11') { 
    return new Foo(name, age, address) 
} 

// Calls 
Foo foo1 = createFoo() // Create Foo with default values 
Foo foo2 = createFoo(age:21) // Create Foo where age param differs from defaut 
Foo foo3 = createFoo(name:'Jane', address:'Low Street 11') // You get the picture 
// + any other combination available 

वास्तविक और एप्लिकेशन है कि मैं पर काम कर रहा हूँ मापदंडों के एक बहुत अधिक होगा इस प्रकार एक बहुत अधिक संयोजन की जरूरत कुछ है।

धन्यवाद

अद्यतन:

कारखाने विधि मैं योजना बना रहा हूँ परीक्षण के लिए है। वास्तव में वास्तविक फू क्लास को स्पर्श नहीं कर सकता है और विशेष रूप से यह डिफ़ॉल्ट मान नहीं है।

@dmahapatro और @codelarks answere नीचे एक मानचित्र के रूप में एक मानचित्र का उपयोग करने में एक अच्छा बिंदु था जिसने मुझे एक संभावित समाधान का विचार दिया। मैं वांछित चूक के साथ एक नक्शा बना सकता हूं और आवश्यक मूल्यों को ओवरराइड कर सकता हूं, और फैक्ट्री विधि को पास कर सकता हूं। यह शायद नौकरी करेगा और मैं इसके साथ जाऊंगा, जब तक कि मुझे बेहतर दृष्टिकोण का संकेत न मिले।

नीचे

defaults = [ name:'john', age:61, address:'High Street'] 

@ToString(includeFields = true, includeNames = true) 
class Foo { 
    // Can't touch this :) 
    def name = '' 
    def age = 0 
    def address = '' 
} 

def createFoo(Map params) { 
    return new Foo(params) 
} 

println createFoo(defaults) 
println createFoo(defaults << [age:21]) 
println createFoo(defaults << [ name:'Jane', address:'Low Street']) 

नोट मेरे वर्तमान दृष्टिकोण: leftShift आपरेशन (< <) मूल नक्शा संशोधित करता है, तो ऊपर के उदाहरण उम्र के साथ-साथ पिछले विधि कॉल में 21 हो जाएगा। मेरे मामले में, यह कोई समस्या नहीं है क्योंकि सेटअप विधि में डिफ़ॉल्ट मानचित्र हर बार ताजा बनाया जा सकता है।

+0

ऐसा नहीं कर सकते हैं। इस मामले में 'डिफ़ॉल्ट' राज्य बनाए रखता है। इसे स्थानीय बनाओ। मेरा अपडेट देखें। – dmahapatro

+0

मुझे एहसास हुआ कि, इसलिए मेरे अपडेट में नोट। वैसे भी, डिफ़ॉल्ट के लिए फ़ंक्शन स्थानीय मानचित्र का उपयोग करना एक बेहतर तरीका है। पारितोषिक के लिए धन्यवाद। – kaskelotti

उत्तर

22

ग्रोवी डिफ़ॉल्ट रूप से आपके लिए (नक्शा कन्स्ट्रक्टर) करता है। आपको कारखाने की विधि की आवश्यकता नहीं होगी। यहाँ एक उदाहरण

import groovy.transform.ToString 

@ToString(includeFields = true, includeNames = true) 
class Foo{ 
    String name = "Default Name" 
    int age = 25 
    String address = "Default Address" 
} 

println new Foo() 
println new Foo(name: "John Doe") 
println new Foo(name: "Max Payne", age: 30) 
println new Foo(name: "John Miller", age: 40, address: "Omaha Beach") 

//Prints 
Foo(name:Default Name, age:25, address:Default Address) 
Foo(name:John Doe, age:25, address:Default Address) 
Foo(name:Max Payne, age:30, address:Default Address) 
Foo(name:John Miller, age:40, address:Omaha Beach) 

अद्यतन
@ codelark के ज्योतिष :) है। यदि कक्षा डिफ़ॉल्ट मान सेट करने के लिए पहुंच योग्य नहीं है, तो आप

@ToString(includeFields = true, includeNames = true) 
class Bar{ 
    String name 
    int age 
    String address 
} 

def createBar(Map map = [:]){ 
    def defaultMap = [name:'John Doe',age:51,address:'High Street 11'] 
    new Bar(defaultMap << map) 
} 

println createBar() 
println createBar(name: "Ethan Hunt") 
println createBar(name: "Max Payne", age: 30) 
println createBar(name: "John Miller", age: 40, address: "Omaha Beach") 


//Prints 
Bar(name:John Doe, age:51, address:High Street 11) 
Bar(name:Ethan Hunt, age:51, address:High Street 11) 
Bar(name:Max Payne, age:30, address:High Street 11) 
Bar(name:John Miller, age:40, address:Omaha Beach) 
+3

और यदि किसी कारण से आप मानचित्र कन्स्ट्रक्टर का उपयोग नहीं करना चाहते हैं, तो आप ऊपर के रूप में कार्य बना सकते हैं लेकिन एक मानचित्र पैरामीटर के साथ और एक ही चीज़ को पूरा कर सकते हैं। – codelark

+1

मैंने इन विवरणों के साथ अपना प्रश्न अपडेट किया है, लेकिन मैं उन्हें यहां आपके लिए भी जोड़ दूंगा। विधि परीक्षण उद्देश्यों के लिए है, इसलिए मैं वास्तविक Foo क्लास के डिफ़ॉल्ट मानों को स्पर्श नहीं कर सकता। – kaskelotti

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