2011-01-28 17 views
5

मैं एक्शनस्क्रिप्ट 3 पृष्ठभूमि से आया हूं और यह मेरी पहली बार मेरी जिंदगी में किसी भी जावा को लिख रहा है। हैशटेबल्स फ्लैश में शब्दकोशों के समान दिखते हैं, लेकिन मैं यह सुनिश्चित करना चाहता हूं कि मैं उनका उपयोग सही तरीके से कर रहा हूं। मेरा मानना ​​है कि हैशटेबल स्ट्रिंग्स को कुंजी और टाइपफेसेस के रूप में ऑब्जेक्ट्स के रूप में स्वीकार करने के लिए टाइप किया गया है। क्या ये सही है? क्या कोई अलग संग्रह उप-वर्ग है जो इस तरह के कुछ के लिए अधिक उपयुक्त होगा? हर तरह से, कृपया मेरे एन 00 बी जावा को फाड़ें। मुझे यह सीखना है।हैशटेबल संपत्ति भंडारण के लिए उपयुक्त है?

package com.typeoneerror.apps.app_name.utils; 

import android.content.Context; 
import android.graphics.Typeface; 

import java.util.Hashtable; 

public class FontRegistry 
{ 
    private static FontRegistry _instance; 

    private Context       _context; 
    private Hashtable<String, Typeface>  _fonts; 

    private FontRegistry() 
    { 
     _fonts = new Hashtable<String, Typeface>(); 
    } 

    public static FontRegistry getInstance() 
    { 
     if (_instance == null) 
     { 
      _instance = new FontRegistry(); 
     } 
     return _instance; 
    } 

    public void init(Context context) 
    { 
     _context = context; 

    } 

    public Typeface getTypeface(int resourceId) 
    { 
     String fontName = _context.getResources().getString(resourceId); 
     if (!_fonts.containsKey(fontName)) 
     { 
      String fontPath = "fonts/" + fontName; 
      Typeface typeface = Typeface.createFromAsset(_context.getAssets(), fontPath); 
      _fonts.put(fontName, typeface); 
     } 
     return (Typeface)_fonts.get(fontName); 
    } 
} 
+2

क्या रैफक ने कहा, यह ठीक है। कुछ और सुझाव: जब आप अंडरस्कोर छोड़ देते हैं (कृपया करें), तो आपको 'this.context = context' की आवश्यकता है। आप 'निजी अंतिम मानचित्र <स्ट्रिंग, टाइपफेस> फोंट = नया हैश मैप <स्ट्रिंग, टाइपफेस>() 'जैसे फ़ॉन्ट्स को प्रारंभ कर सकते हैं। यदि समरूपता थी, तो आप अपने आलसी सिंगलटन के साथ समस्याएं पा सकते हैं। चेतावनी पर स्विच करें, आपकी आखिरी कास्ट निश्चित रूप से अनावश्यक है। – maaartinus

+1

क्या इस कक्षा तक पहुंच एकल- या बहु-थ्रेडेड होगी? मैं केवल इसलिए पूछता हूं कि 'getInstance() 'का वर्तमान कार्यान्वयन थ्रेड सुरक्षित नहीं है। –

+0

@ dave.c मुझे स्वीकार करना है कि मुझे कोई जानकारी नहीं है। जैसा कि मैंने कहा, यह मेरा पहला समय जावा लिख ​​रहा है, इसलिए उत्तर के रूप में उस पर कोई सलाह बहुत सराहना की जाएगी। – typeoneerror

उत्तर

7

आपके लिए दो सुझाव।

सबसे पहले, चर प्रकार को मानचित्र के इंटरफ़ेस को संदर्भित करना चाहिए। यह आपको भविष्य के लिए अधिक लचीलापन देता है, और अधिकांश अन्य जावा देवताओं के साथ बेहतर जाल करेगा।

दूसरा, कार्यान्वयन एक हैश मैप होना चाहिए, हैशटेबल नहीं। हैशटेबल सब कुछ सिंक्रनाइज़ करता है, जहां हैश मैप नहीं करता है।

यदि आपको बहुप्रचारित पहुंच की आवश्यकता है, तो मैं हैशटेबल के बजाय एक ConcurrentHashMap का उपयोग करने का सुझाव दूंगा। ConcurrentHashMap बेहतर प्रदर्शन करता है, क्योंकि यह पूरे मानचित्र को एक्सेस के दौरान लॉक नहीं करता है।

तो,

private Map<String, Typeface>  _fonts; 

और

_fonts = new HashMap<String, Typeface>(); 

अन्त में, कई जावा devs पसंद करते हैं कि आप एक अंडरस्कोर से सदस्य चर शुरू नहीं करना होगा। हालांकि यह एक बहस योग्य वरीयता है।

संपादित करें: एक अंतिम नाइटपिक। आप रजिस्ट्री के लिए सिंगलटन पैटर्न का उपयोग कर रहे हैं। यह आपको बाद में काट सकता है, इसलिए सिंगलेट्स http://accu.org/index.php/journals/337 से बचने पर विचार करें। लेकिन, इसे अनदेखा करते हुए, आप घोषणापत्र में सिंगलटन स्थिर उदाहरण को तुरंत चालू करने से बेहतर हो सकते हैं। यह पहली बार लाने के दौरान एक संभावित विवाद से बच सकता है।

तो:

private static FontRegistry _instance = new FontRegistry; 
+0

महान उत्तर, धन्यवाद।मैं सिंगलटन पैटर्न के प्रशंसक नहीं हूं। शायद रिफैक्टर होगा। – typeoneerror

+1

एक 'स्थिर' सदस्य के रूप में 'संदर्भ' वाला सिंगलटन पैटर्न एंड्रॉइड में भी खतरनाक है क्योंकि यह 'संदर्भ 'को' कन्टेक्स्ट 'के रूप में पारित कचरा होने से रोक सकता है। –

1

मेरी टिप्पणी पर विस्तार करने के लिए, getInstance() अपने क्रियान्वयन की सुरक्षित थ्रेड नहीं है। क्या तुम सच में सिंगलटन पैटर्न का उपयोग करना चाहिए, तो आप "बिल प्यूघ" संस्करण (जो मैं तो एकदम wikipedia article से कॉपी किया है) का उपयोग कर सकते हैं:

public class Singleton { 

    // Private constructor prevents instantiation from other classes 
    private Singleton() { 
    } 

    /** 
    * SingletonHolder is loaded on the first execution of Singleton.getInstance() 
    * or the first access to SingletonHolder.INSTANCE, not before. 
    */ 
    private static class SingletonHolder { 
     public static final Singleton INSTANCE = new Singleton(); 
    } 

    public static Singleton getInstance() { 
     return SingletonHolder.INSTANCE; 
    } 
} 

इसके अलावा आप जब एंड्रॉयड नहीं करने के लिए "रिसाव के लिए विकसित करने सावधान रहना चाहिए "एक Context। यहां एक good article है, ऐसा क्यों करना बुरा है, और इससे कैसे बचें। निचली पंक्ति यह है कि staticContext (या एक ऑब्जेक्ट जो स्वयं Context का संदर्भ देता है) का संदर्भ हो सकता है इसका मतलब यह हो सकता है कि आपका Activity उदाहरण कचरा एकत्र नहीं किया जा सकता है।

+0

यह लिखने के लिए धन्यवाद, डेव। – typeoneerror

+0

महान लिंक। मुझे ध्यान रखना चाहिए कि मैं प्रारंभकर्ता के लिए अनुप्रयोग संदर्भ का उपयोग कर रहा हूं: FontRegistry.getInstance()। Init (getApplicationContext()); । आलेख निर्दिष्ट करता है कि "... अनुप्रयोग संदर्भ। यह संदर्भ तब तक लाइव रहेगा जब तक आपका आवेदन ज़िंदा नहीं है और यह गतिविधि चक्र चक्र पर निर्भर नहीं है" – typeoneerror

+0

खुशी है कि आपने उन्हें उपयोगी पाया। जैसा कि आप बताते हैं, 'getAplicationContext()' का उपयोग करके समस्या से बचने का एक तरीका है। –

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