2013-02-01 98 views
54

मैं हाल ही में लगातार String कुंजी पता करने के लिए जब मेरे Fragments बनाने Bundles में तर्क पारित करने के लिए होने के थक गया हो गया। तो मैंने अपने Fragments के लिए कन्स्ट्रक्टर बनाने का फैसला किया जो पैरामीटर लेना चाहते थे, और String कुंजी के साथ उन चर को Bundles में डाल दें, इसलिए अन्य Fragments और Activities की आवश्यकता को समाप्त करने के लिए उन चाबियों को जानने की आवश्यकता है।एक टुकड़ा बनाना: निर्माता बनाम newInstance()

public ImageRotatorFragment() { 
    super(); 
    Log.v(TAG, "ImageRotatorFragment()"); 
} 

public ImageRotatorFragment(int imageResourceId) { 
    Log.v(TAG, "ImageRotatorFragment(int imageResourceId)"); 

    // Get arguments passed in, if any 
    Bundle args = getArguments(); 
    if (args == null) { 
     args = new Bundle(); 
    } 
    // Add parameters to the argument bundle 
    args.putInt(KEY_ARG_IMAGE_RES_ID, imageResourceId); 
    setArguments(args); 
} 

और फिर मैं उन तर्कों को सामान्य की तरह खींचता हूं।

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    Log.v(TAG, "onCreate"); 

    // Set incoming parameters 
    Bundle args = getArguments(); 
    if (args != null) { 
     mImageResourceId = args.getInt(KEY_ARG_IMAGE_RES_ID, StaticData.getImageIds()[0]); 
    } 
    else { 
     // Default image resource to the first image 
     mImageResourceId = StaticData.getImageIds()[0]; 
    } 
} 

हालांकि, एक प्रकार का वृक्ष इस के साथ इस मुद्दे को ले लिया और कहा कि अन्य मानकों के साथ कंस्ट्रक्टर्स साथ Fragment की उपवर्गों के लिए नहीं, मुझे @SuppressLint("ValidFragment") उपयोग करने के लिए भी अनुप्रयोग चलाने के लिए की जरूरत पड़ेगी। बात यह है कि यह कोड पूरी तरह से ठीक काम करता है। मैं ImageRotatorFragment(int imageResourceId) या पुरानी स्कूल विधि ImageRotatorFragment() का उपयोग कर सकता हूं और इसे मैन्युअल रूप से setArguments() पर कॉल कर सकता हूं। जब एंड्रॉइड को फ्रैगमेंट (अभिविन्यास परिवर्तन या कम मेमोरी) को फिर से बनाने की आवश्यकता होती है, तो यह ImageRotatorFragment() कन्स्ट्रक्टर को कॉल करता है और उसके बाद मेरे मानों के साथ Bundle समान तर्क देता है, जो सही ढंग से सेट हो जाता है।

तो मैं "सुझाए गए" दृष्टिकोण की खोज कर रहा हूं और newInstance() का उपयोग करके कई उदाहरण देखता हूं ताकि पैरामीटर के साथ Fragments बनाया जा सके, जो मेरे कन्स्ट्रक्टर की तरह ही काम करता है। तो मैंने इसे परीक्षण करने के लिए अपना खुद का बना दिया, और यह पहले की तरह बेकार ढंग से काम करता है, इसके बारे में लिंट कम से कम लिंट।

public static ImageRotatorFragment newInstance(int imageResourceId) { 
    Log.v(TAG, "newInstance(int imageResourceId)"); 

    ImageRotatorFragment imageRotatorFragment = new ImageRotatorFragment(); 

    // Get arguments passed in, if any 
    Bundle args = imageRotatorFragment.getArguments(); 
    if (args == null) { 
     args = new Bundle(); 
    } 
    // Add parameters to the argument bundle 
    args.putInt(KEY_ARG_IMAGE_RES_ID, imageResourceId); 
    imageRotatorFragment.setArguments(args); 

    return imageRotatorFragment; 
} 

मैं व्यक्तिगत रूप से लगता है कि निर्माताओं का उपयोग कर newInstance() उपयोग करने के लिए जानने और पैरामीटर प्रदान करने की तुलना में काफी अधिक आम बात है। मेरा मानना ​​है कि आप इस कन्स्ट्रक्टर तकनीक का उपयोग गतिविधियों के साथ कर सकते हैं और लिंट इसके बारे में शिकायत नहीं करेंगे। तो मूल रूप से मेरा सवाल यह है कि Google क्यों नहीं चाहता कि आप Fragments के लिए पैरामीटर के साथ रचनाकारों का उपयोग करें?

मेरा एकमात्र अनुमान यह है कि आप Bundle का उपयोग किए बिना एक इंस्टेंस चर सेट करने का प्रयास नहीं करते हैं, जो Fragment पुनर्निर्मित होने पर सेट नहीं होगा। static newInstance() विधि का उपयोग करके, कंपाइलर आपको एक आवृत्ति चर तक पहुंचने नहीं देगा।

public ImageRotatorFragment(int imageResourceId) { 
    Log.v(TAG, "ImageRotatorFragment(int imageResourceId)"); 

    mImageResourceId = imageResourceId; 
} 

मुझे अभी भी ऐसा नहीं लगता है कि यह रचनाकारों में पैरामीटर के उपयोग को अस्वीकार करने का पर्याप्त कारण है। किसी और को इस में अंतर्दृष्टि है?

उत्तर

59

मुझे व्यक्तिगत रूप से पता चलता है कि नए इंस्टेंस() और पास पैरामीटर का उपयोग करने के बारे में जानने से रचनाकारों का उपयोग करना एक और अधिक आम प्रथा है।

factory method pattern आधुनिक सॉफ्टवेयर विकास में काफी बार उपयोग किया जाता है।

तो मूल रूप से मेरा सवाल यह है कि Google क्यों नहीं चाहता कि आप टुकड़ों के लिए पैरामीटर के साथ रचनाकारों का उपयोग करें?

आप अपनी खुद की सवाल का जवाब:

मेरी केवल अनुमान तो आप बंडल, जो सेट जब टुकड़ा निर्मित हो जाता है नहीं मिलेगा का उपयोग किए बिना एक उदाहरण चर सेट करने का प्रयास न करना पड़े।

सही।

मुझे अभी भी ऐसा नहीं लगता है कि यह रचनाकारों में पैरामीटर के उपयोग को अस्वीकार करने के लिए पर्याप्त कारण है।

आपकी राय में आपका स्वागत है। इस लिंट चेक को प्रति-कन्स्ट्रक्टर या प्रति-कार्यक्षेत्र फैशन पर अक्षम करने के लिए आपका स्वागत है।

0

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