2010-05-02 24 views
8

मैं एक प्रोग्राम बना रहा हूं जो कुछ स्थिरांक का उपयोग करता है। सबसे पहले, हर बार जब मैं एक निरंतर उपयोग करने के लिए की जरूरत है, मैं इसे के रूप मेंसिंगलेट और स्थिरांक

//C# 
private static readonly int MyConstant = xxx; 

//Java 
private static final int MyConstant = xxx; 

कक्षा में जहां मैं इसे आवश्यकता होगी निर्धारित करेंगे। कुछ समय बाद, मुझे एहसास हुआ कि एक से अधिक वर्गों में कुछ स्थिरांक की आवश्यकता होगी।

  1. विभिन्न वर्गों है कि यह जरूरत में उन्हें परिभाषित करने के लिए:

    इस समय, मैं 3 choises था। यह पुनरावृत्ति की ओर जाता है। अगर किसी कारण से मुझे उनमें से एक को बदलने की ज़रूरत है, तो मुझे हर जगह उन्हें बदलने के लिए सभी वर्गों में जांच करनी होगी।

  2. सभी स्थिरांकों के साथ एक स्थिर वर्ग/सिंगलटन को सार्वजनिक रूप से परिभाषित करने के लिए।
  3. यदि मुझे कक्षा, कक्षा बी और कक्षासी में निरंतर एक्स की आवश्यकता है, तो मैं इसे कक्षा में सार्वजनिक रूप से परिभाषित कर सकता हूं, और उसके बाद कक्षाबी और कक्षासी उन्हें संदर्भित कर सकती है। यह समाधान मेरे लिए अच्छा प्रतीत नहीं होता है क्योंकि यह कक्षाओं के बीच पहले से ही अधिक निर्भरताएं पेश करता है।

मैंने दूसरे विकल्प के साथ अपना कोड लागू करना समाप्त कर दिया। क्या यह सबसे अच्छा विकल्प है? मुझे लगता है कि शायद मुझे कुछ और बेहतर विकल्प याद आ रहा है।

यहां सिंगलटन का उपयोग करने के बारे में मुझे क्या चिंता है कि यह वर्ग के उपयोगकर्ता के लिए कहीं भी स्पष्ट नहीं है कि यह वर्ग सिंगलटन का उपयोग कर रहा है। हो सकता है कि मैं एक कॉन्स्टेंट क्लास बना सकूं जो सभी स्थिरांकों को जरूरी रखे और फिर मैं उन वर्गों के लिए निर्माता को पास कर दूंगा जिन्हें इसकी आवश्यकता होगी?

धन्यवाद

संपादित करें: मैं ज्यादातर जटिल प्रकार, नहीं ints और तार के लिए इस का उपयोग कर रहा हूँ। कम से कम सी # मामले में जो एक फर्क पड़ता है इसका मतलब है कि मैं const कीवर्ड का उपयोग नहीं कर सकता।

उत्तर

5

सी # के बारे में कोई शब्द नहीं, लेकिन जावा में इस समस्या को हल करने के कई तरीके हैं।

  1. बदलें access modifier डिफ़ॉल्ट (पैकेज-मात्र) या public। सबसे सरल समाधान।

  2. उन्हें पैकेज-निजी या publicenum में समूहित करें। सबसे सरल अगर वे मान संबंधित एक-दूसरे से संबंधित हैं। जैसे Role.ADMIN, Role.USER, Role.GUEST, आदि

  3. उन्हें पैकेज-निजी या publicinterface में घोषित करें और कक्षाओं को इसे लागू करने दें। केवल तभी ऐसा करें यदि उन स्थिरांक से संबंधित हैं अनुबंध कक्षाओं को भी पालन करना होगा।

  4. उन्हें properties files में रखें और private static final Properties के रूप में लोड करें और public static String getProperty(String key) जोड़ें। इसे कुछ पैकेज-निजी या publicConfiguration कक्षा में लपेटें। अधिक उपयोगी अगर उन स्थिरांक परिवर्तनों के प्रति संवेदनशील हो सकते हैं जिन्हें आप बाहरी रूप से नियंत्रित कर सकते हैं।

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

+0

यदि यह एक सिंगलटन में था, तो निश्चित रूप से उन्हें स्थैतिक घोषित नहीं किया जाएगा। यदि स्थिर वर्ग में या प्रत्येक वर्ग के अंदर रखे जाने की आवश्यकता होती है तो उन्हें स्थिर घोषित किया जाएगा। –

+1

फिर वे मान वास्तव में ** स्थिरांक ** नहीं हैं। नहीं, सिंगलटन विचार भूल जाओ। – BalusC

1

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

4

गुण फ़ाइल का उपयोग करें और वहां स्थिरांक रखें।

+1

मैं क्यों मिला है डिंग किया? –

0

इसका एक दृष्टिकोण जावा और .NET दोनों में उपलब्ध वसंत का उपयोग करना होगा।

www.springsource.org
www.springframework.net - .net

अन्यथा मैं एक कॉन्फ़िग फ़ाइल का उपयोग करेंगे।

+0

जब आप एक कॉन्फ़िगरेशन फ़ाइल का मतलब रखते हैं, तो अंत में आप सिंगलटन की तरह कुछ उपयोग करना चाहते हैं? –

+0

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

+0

हां, लेकिन डिज़ाइन बिंदु से आप जो कर रहे हैं, वह एक स्थिर वर्ग की तरह दिखने वाले कुछ में निर्भर है। आपके पास सभी ऑब्जेक्ट्स उस ऑब्जेक्ट पर निर्भर हैं जिसमें "वैश्विक" स्थिति है। –

2

ConfigurationManager.AppSettings Property नेट में इस कारण से मौजूद है। आप सेटिंग्स को कॉन्फ़िगरेशन फ़ाइलों में डालते हुए मानते हैं कि ये वे तत्व हैं जिन्हें आप एक ही स्थान पर सेट करना चाहते हैं, उदाहरण के लिए। ASP.Net का उपयोग कर वेबसाइट के लिए web.config एक स्थान है जहां सेटिंग्स को रखा जा सकता है ताकि विकास, परीक्षण और उत्पादन वातावरण प्रत्येक के पास अलग-अलग सेटिंग्स हो सकें।

+0

हां लेकिन यह एक स्थिर वर्ग के रूप में समाप्त होता है, है ना? –

+1

शायद, लेकिन मेरा मुद्दा यह है कि आपको जो कुछ चाहिए, उसे करने के लिए अंतर्निहित कक्षाएं हैं, तो उनका उपयोग क्यों न करें? –

2

जहाँ तक int का प्रश्न है मैं आमतौर पर सी #

public enum MyMagicNumbers 
{ 
    TheFirst = 1, 
    TheSecond = 2, 
    TheLast = 10, 
} 

में एक enum का उपयोग अन्य प्रकार के लिए - BalusC की तरह पहले ही उल्लेख किया - एक सील बंद वर्ग आप सभी की जरूरत है

public sealed class MyMagicStuff 
{ 
    private MyMagicStuff() {} 

    public const string TheFirst = "One"; 
    public const string TheSceond = "Two"; 
    public const string TheLast = "Ten"; 
} 
+0

यदि आप कक्षा को तुरंत चालू नहीं कर सकते हैं और फ़ील्ड स्थिर नहीं हैं तो कोई भी डेटा का उपयोग कैसे करेगा? –

+1

@devoured कम से कम सी # में उन्हें 'const' बनाने के लिए पर्याप्त है। – Filburt

+1

उस तथ्य को नहीं पता था। वैसे भी, मेरे प्रकार जटिल हैं, इस प्रकार मैं उन पर "कॉन्स्ट" संशोधक का उपयोग नहीं कर सकता। –

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