2010-03-04 14 views
5

यह एक पुरानी समस्या हो सकती है और मुझे यकीन है कि हर किसी के अपने तरीके हैं। मान लीजिए मैं कुछ गुण जैसेजावा गुण - खुलासा करने या प्रकट करने के लिए नहीं?

secret.user.id=user 
secret.password=password 
website.url=http://stackoverflow.com 

मान लीजिए परिभाषित मैं 100 विभिन्न वर्गों और स्थानों पर जहां मैं इन गुणों का उपयोग करने की आवश्यकता होती है। कौन सा अच्छा है (1) मैं एक यूटिल क्लास बनाता हूं जो सभी गुणों को लोड करेगा और एक महत्वपूर्ण स्थिर का उपयोग करके उनकी सेवा करेगा: यूटिल एक सिंगलटन है जो सभी गुणों को लोड करता है और getInstance() कॉल पर रहता है।

Util myUtil = Util.getInstance(); 
String user = myUtil.getConfigByKey(Constants.SECRET_USER_ID); 
String password = myUtil.getConfigByKey(Constants.SECRET_PASSWORD); 
.. 
//getConfigByKey() - inturns invokes properties.get(..) 
doSomething(user, password) 

तो जहां भी मुझे इन गुणों की आवश्यकता है, मैं ऊपर दिए गए कदम उठा सकता हूं।

(2) मैं इन गुणों का प्रतिनिधित्व करने के लिए एक सार्थक वर्ग बना रहा हूं; कहें, एप्लिकेशन कॉन्फिग और विशिष्ट गुण प्राप्त करने के लिए गेटर्स प्रदान करें।

ApplicationConfig config = ApplicationConfig.getInstance(); 
doSomething(config.getSecretUserId(), config.getPassword()); 
//ApplicationConfig would have instance variables that are initialized during 
// getInstance() after loading from properties file. 

नोट:: तो ऊपर दिए गए कोड की तरह लग सकता है गुण फ़ाइल जैसे भविष्य में केवल मामूली बदलाव होगा।

मेरी व्यक्तिगत पसंद है (2) - मुझे कुछ टिप्पणियां सुनें?

+0

क्या प्रॉपर्टी को किसी भी तरह से कैश नहीं किया जाएगा, इसलिए यदि आप इसे कई अलग-अलग स्थानों में लोड करते हैं तो कोई प्रदर्शन दंड नहीं है? – willcodejavaforfood

+0

बॉयलर प्लेट क्यों? मैं बात नहीं करता कि यह एक अच्छा सुझाव है। यह भी ध्यान दें, मैंने इसे प्रोग्राम डिज़ाइन के साथ टैग किया है। मुझे कोड पसंद है जो अच्छी तरह से काम करता है और अच्छी तरह से पढ़ता है। –

उत्तर

1

मैं आवश्यकता से अधिक वर्बोज़ होने के लिए पहले दृष्टिकोण पाते हैं। (विशेष रूप से यदि गुणों को बहुत अधिक बदलने की उम्मीद नहीं है।) इसके अलावा, दूसरे दृष्टिकोण का उपयोग करके आप कास्टिंग/प्रकार के मुद्दों को संभालने में सक्षम हो सकते हैं जब गुणों का उपयोग किए जाने के बजाए लोड किया जाता है।

+0

कास्टिंग बिंदु पसंद आया। –

0

मुझे लगता है कि मेरा पहला सवाल यह है कि आप जो कुछ कह रहे हैं उसका एक उदाहरण बनाना चाहते हैं वह एक सिंगलटन है (आपने Util.getInstance() जैसे कोड का उपयोग करके उल्लेख किया है। एक सिंगलटन में केवल 1 उदाहरण होता है, इसलिए आपको अपने कोड में कई प्रतियों को तुरंत चालू करने की कोशिश नहीं करनी चाहिए।

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

+1

वह * है * आप एक सिंगलटन उदाहरण तक पहुंचने के तरीकों में से एक है। – alphazero

+0

सहमत, Util.getInstance()। जो भी विधि .. पर्याप्त है। प्रतिलिपि बनाई गई प्रतियां (यदि मैंने वास्तव में कोड स्पष्टता के लिए पूरी तरह से किया था) लेकिन आपका उत्तर पूरा नहीं हुआ था। दोनों मामलों में मेरे पास सिंगलटन है।सवाल यह है कि एक निरंतर कुंजी आधारित दृष्टिकोण का उपयोग करना है या कुछ वर्गों को मॉडल करना है जो गेटर्स –

0

मुझे नहीं लगता कि दूसरे पर एक विधि का कोई महत्वपूर्ण लाभ है और मुझे नहीं लगता कि समाधान (1) अधिक सुरक्षित है, क्योंकि यह पासवर्ड प्राप्त करने के लिए जावा गेटर के बजाय एक संपत्ति कुंजी प्रदान करता है ।

अगर मुझे एक चुनना पड़ा तो मैं विकल्प (2) लेता।

+0

एचएम प्रदान करेंगे .. मुझे लगता है कि myUtil.getConfigByKey (Constants.SECRET_PASSWORD); सुरक्षित या (उस मामले के लिए कम) है: config.getPassword() –

+1

सहमत है कि यह सुरक्षित (या कम) है। यदि myUtil अच्छी तरह से लिखा गया था और JVM सुरक्षा बढ़ी है (निजी चर के प्रतिबिंब/निरीक्षण को रोकने के लिए) तो यह * काफी * सुरक्षित –

2

यह सबसे सरल तरीका (स्थिर मूल्यों के साथ एक वर्ग) कार्य करें:

package com.domain.packagename 

public class Properties { 
    private static String hostName; 
    public static getHostName() { return hostName; } 
    private static int port; 
    public static int getPort() { return port; } 

    public static void load() { 
     //do IO stuff, probably 
     hostName = ??; 
     port = ??; 
     //etc 
    } 
} 
+1

वोट 1 हो सकता है क्योंकि यह कुछ अच्छे विचार देता है। गुणों का प्रतिनिधित्व करने के लिए एक अपरिवर्तनीय वर्ग बनाया जा सकता है जैसे: पब्लिक क्लास कॉन्फ़िगरेशन { सार्वजनिक अंतिम स्ट्रिंग उपयोगकर्ता आईडी; सार्वजनिक अंतिम स्ट्रिंग पासवर्ड; सार्वजनिक अंतिम int समय आउट; निजी स्थैतिक विन्यास CONFIG = शून्य; निजी विन्यास (गुण सहारा) { // कोड अंतिम चर पॉप्युलेट करने के लिए // कुछ सिंगलटन mumbo- जंबो } सार्वजनिक स्थिर getInstance() { // ... } –

1

एप्लिकेशन विकल्प विशिष्ट गेटर्स रखने के लिए आपका विकल्प (2) बेहतर और साफ लगता है। इंटरफ़ेस से सार्वजनिक स्थैतिक अंतिम कुंजी उम्र के लिए जावा में एक खराब डिज़ाइन किया गया था।

+0

हां! मुझे भी एक इंटरफ़ेस से सार्वजनिक स्थिर अंतिम कुंजी पसंद नहीं है –

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