android - Butterknife देखें इंजेक्शन



dependency-injection (1)

मैं ButterKnife नामक एक बहुत ही दिलचस्प निर्भरता इंजेक्शन पुस्तकालय में ठोकर खाई। ButterKnife का उपयोग करना गतिविधियों या टुकड़ों में दृश्यों को इंजेक्षन करना आसानी से संभव है।

class ExampleActivity extends Activity {
  @InjectView(R.id.title) TextView title;
  @InjectView(R.id.subtitle) TextView subtitle;
  @InjectView(R.id.footer) TextView footer;

  @Override public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.simple_activity);
    ButterKnife.inject(this);
    // TODO Use "injected" views...
  }
}

हालांकि निर्भरता इंजेक्शन का उपयोग करते हुए उन दृश्यों को public होना चाहिए ताकि Butterknife इसे इंजेक्ट कर सकें (अपवाद fields must not be private or static में private फ़ील्ड परिणाम का उपयोग fields must not be private or static )

मेरी पिछली परियोजना में मैंने हमेशा सभी सदस्यों के खेतों (विचारों सहित) को private क्योंकि मैंने सोचा था कि यह सबसे अच्छा अभ्यास है (सूचना छुपा आदि।) अब मैं सोच रहा हूं कि एक कारण है कि किसी को भी सभी विचार public नहीं करना चाहिए? इस मामले में मैं ButterKnife उपयोग नहीं कर सकता, लेकिन मैं इसका इस्तेमाल करना चाहता हूं क्योंकि यह कोड को बहुत सरल करता है।


सबसे पहले, मक्खन चाकू एक निर्भरता इंजेक्शन लाइब्रेरी नहीं है आप इसे एक बॉयलरप्लेट कटौती लाइब्रेरी के रूप में सोच सकते हैं क्योंकि यह सब कुछ खोज findViewById और विभिन्न setXxxListener कॉल्स को setXxxListener है।

कारण है कि मक्खन चाकू के विचारों को निजी नहीं होने की आवश्यकता है, यह वास्तव में कोड उत्पन्न करता है जो खेतों को सेट करता है यह कोड जो आपके क्लास के समान पैकेज में जीवन उत्पन्न करता है, यही कारण है कि फील्ड पैकेज-निजी, संरक्षित, या सार्वजनिक होना चाहिए। यदि फ़ील्ड निजी था तो जनरेटेड कोड संकलित करने में विफल होगा क्योंकि यह निजी फ़ील्ड तक नहीं पहुंच सकता है।

उत्पन्न कोड कुछ ऐसा दिखता है:

public static void inject(ExampleActivity target, ExampleActivity source) {
  target.title = (TextView) source.findViewById(R.id.title);
  target.subtitle = (TextView) source.findViewById(R.id.subtitle);
  target.footer = (TextView) source.findViewById(R.id.footer);
}

जब आप ButterKnife.inject(this) कॉल करते हैं तो यह इस क्लास को उत्पन्न करता है और उदाहरण के रूप में अपनी सुविधा उदाहरण के रूप में ExampleActivity करता है, फ़ील्ड के लिए दोनों गंतव्य और findViewById कॉल के लिए स्रोत





butterknife