जावा में गतिशील नामों के साथ चर निर्दिष्ट करना


96

मैं जावा में वैरिएबल का एक सेट असाइन करना चाहता हूं:

int n1,n2,n3;

for(int i=1;i<4;i++)
{
    n<i> = 5;
}

मैं इसे जावा में कैसे प्राप्त कर सकता हूं?


1
क्या आप कृपया अपना प्रश्न स्पष्ट कर सकते हैं?
Eng.Fouad

4
आपको स्थानीय चर के लिए ऐसा करने की आवश्यकता है? एरे तत्व क्यों नहीं?
रे तोल

@ Eng.Fouad: मैं गतिशील रूप से उनके नाम से चर का उपयोग करना चाहता हूं।
आशीष आनंद

@ आशीष आनंद क्या आपका मतलब है stackoverflow.com/questions/6629995/…
mKorbel

जवाबों:


111

यह नहीं है कि आप जावा में चीजें कैसे करते हैं। जावा में कोई गतिशील चर नहीं हैं। जावा चर को सोर्स कोड 1 में घोषित किया जाना है ।

आप जो हासिल करने की कोशिश कर रहे हैं, उसके आधार पर, आपको एक सरणी, Listया एक का उपयोग करना चाहिए Map; जैसे

int n[] = new int[3];
for (int i = 0; i < 3; i++) {
    n[i] = 5;
}

List<Integer> n = new ArrayList<Integer>();
for (int i = 1; i < 4; i++) {
    n.add(5);
}

Map<String, Integer> n = new HashMap<String, Integer>();
for (int i = 1; i < 4; i++) {
    n.put("n" + i, 5);
}

स्रोत कोड में घोषित किए गए वेरिएबल्स को गतिशील रूप से संदर्भित करने के लिए प्रतिबिंब का उपयोग करना संभव है । हालाँकि, यह केवल उन चरों के लिए काम करता है जो कक्षा के सदस्य हैं (यानी स्थैतिक और उदाहरण क्षेत्र)। यह स्थानीय चरों के लिए काम नहीं करता है। @ Fyr का "त्वरित और गंदा" उदाहरण देखें।

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


1 - वह कथन थोड़ा गलत है। यदि आप BCEL या ASM का उपयोग करते हैं, तो आप bytecode फ़ाइल में चर को "घोषित" कर सकते हैं। लेकिन यह मत करो! उस तरह पागलपन है!


1
थैंक्स बहुत, मुझे जो मिल रहा था वह मिल गया। अंतिम भाग (मानचित्र <स्ट्रिंग, पूर्णांक>)।
आशीष आनंद

1
यह ध्यान दिया जाना चाहिए कि भले ही यह संभव होगा, यह ऐसा कुछ नहीं होना चाहिए जो आप वास्तव में करेंगे। आप इससे कुछ हासिल नहीं करते; आप वास्तव में पठनीयता खो देंगे। यदि आप उन्हें लिंक करना चाहते हैं Map<String, T>, तो इसके बजाय का उपयोग करें, अपने वास्तविक कोड के साथ खिलवाड़ शुरू न करें।
जीरो वेनवेल

2
@JeroenVannevel - यही मेरा मतलब है "पागलपन" :-)
स्टीफन सी

35

यदि आप चर का उपयोग करना चाहते हैं तो आप किसी प्रकार के गतिशील का उपयोग कर सकते हैं। हालांकि प्रतिबिंब स्थानीय चर के लिए नहीं काम करता है। यह केवल क्लास विशेषताओं के लिए लागू है।

एक त्वरित और गंदा उदाहरण यह है:

public class T {
    public Integer n1;
    public Integer n2;
    public Integer n3;

    public void accessAttributes() throws IllegalArgumentException, SecurityException, IllegalAccessException,
            NoSuchFieldException {

        for (int i = 1; i < 4; i++) {
            T.class.getField("n" + i).set(this, 5);
        }
    }
}

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


3
उत्कृष्ट जब आपको एंड्रॉइड के सेंसर event.values ​​[] को चर के एक सेट में बदलने की आवश्यकता होती है। event.values ​​[] 1 से 6 तक की लंबाई हो सकती है और यह सरणी-कम json मार्शलिंग के लिए मेरे मामले में परिवर्तित करना आसान है।
Farshid T

12

आपको जिस चीज़ की आवश्यकता है उसका नाम सरणी है। मैं निम्नलिखित कोड लिखना चाहता था:

int[] n = new int[4];

for(int i=1;i<4;i++)
{
    n[i] = 5;
}

1
सरणियों का उपयोग नहीं करना चाहते हैं। मैं कुछ स्थिति के आधार पर चर (n1, n2, n3) को गतिशील रूप से एक्सेस करना चाहता हूं।
आशीष आनंद

10

आपको उपयोग करना चाहिए Listया arrayइसके बजाय

List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);

या

int[] arr  = new int[10];
arr[0]=1;
arr[1]=2;

या इससे भी बेहतर

Map<String, Integer> map = new HashMap<String, Integer>();
map.put("n1", 1);
map.put("n2", 2);

//conditionally get 
map.get("n1");

7

जावा में डायनामिक वेरिएबल नाम
ऐसी कोई चीज नहीं है।

आपके मामले में आप सरणी का उपयोग कर सकते हैं:

int[] n = new int[3];
for() {
 n[i] = 5;
}

अधिक सामान्य (name, value)जोड़े के लिए, का उपयोग करेंMap<>


4

इस तरह आजमाएं:

    HashMap<String, Integer> hashMap = new HashMap();

    for (int i=1; i<=3; i++) {
        hashMap.put("n" + i, 5);
    }

4

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.