जावा में वैश्विक चर


217

आप जावा में वैश्विक चर को कैसे परिभाषित करते हैं?


20
क्या आप हमें बता सकते हैं कि आप जावा में वैश्विक चर को क्यों परिभाषित करना चाहते हैं?
एडम पैन्नर

44
कक्षा के बाहर से चर का उपयोग करने के लिए
aTJ

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

7
@ अदम: मुझे एक वर्ग में दूसरे वर्ग से चर का मान बदलने में सक्षम होना चाहिए।
ATJ

2
तुम नहीं। जावा में कोई वैश्विक चर नहीं हैं।
लोरेन के मार्किस

जवाबों:


261

ग्लोबल वेरिएबल को परिभाषित करने के लिए आप स्टेटिक कीवर्ड का उपयोग कर सकते हैं

public class Example {
    public static int a;
    public static int b;
}

अब आप कॉल करके कहीं से भी ए और बी एक्सेस कर सकते हैं

Example.a;

Example.b;

6
"ग्लोबल" वर्ग का नाम है।
जेरोम

12
ऐसा करते समय सावधान रहें - जब ग्लोबल क्लास अनलोड हो जाए तो वेरिएबल अपरिभाषित हो जाएगा। यदि आप अपना ऐप बेचते हैं तो यह जल्दी या बाद में होगा और आप हर जगह त्रुटि
ढूंढते रहेंगे,

10
staticजबकि उनके वर्ग भरी हुई है कीवर्ड, चर विश्व स्तर पर सुलभ बना देता है।
sjas

22
क्लास अनलोडिंग के बारे में: यदि ग्लोबल या उसके बच्चों के उदाहरण के लिए किसी भी GC Root से कोई मजबूत संदर्भ श्रृंखला है, या लोडेड और न-अनलोडेबल क्लास से ग्लोबल के सापेक्ष कोई संकलन समय संदर्भ है, तो ग्लोबल के सापेक्ष क्लास ऑब्जेक्ट जोरदार है पुनः प्राप्य, और, इसलिए, क्लासलोडर है जिसने ग्लोबल लोड किया है; जो ग्लोबल को अनलोड करने के लिए असंभव बनाता है (चूंकि क्लास अनलोडिंग केवल तब हो सकती है जब जीसी पूरी तरह से किसी वर्ग को लोड करने वाले क्लासऑलर को कोई मजबूत संदर्भ हटा देता है)। यदि आपके पास कोई संदर्भ नहीं है, तो उतराई एक समस्या कैसे हो सकती है ???
ब्रूनो रीस

4
@Abi मैं आपकी कक्षा का नाम बदलकर Globalकुछ और ( TestClass?) करने का सुझाव दूंगा ताकि लोगों को यह आभास न हो कि Globalजावा कीवर्ड जैसी कोई चीज है । सॉरी से बेहतर सुरक्षित :)
निकोलस रिनायडो

53

तुम नहीं। वह डिजाइन द्वारा है। यदि आप कर सकते हैं तो भी आपको ऐसा नहीं करना चाहिए।

कहा जा रहा है कि आप ग्लोबल्स नामक एक वर्ग में सार्वजनिक स्थैतिक सदस्यों का एक सेट बना सकते हैं।

public class Globals {
   public static int globalInt = 0;
   ///
}

लेकिन आप वास्तव में नहीं होना चाहिए :)। गंभीरता से .. यह मत करो।


6
फिर क्या बेहतर तरीका है कि मैं स्थिरांक घोषित कर सकता हूं ताकि सभी वर्ग विधियां उन तक पहुंच सकें?
Alston

6
इस प्रकृति के पोस्ट कारण हैं कि नौसिखिए वैश्विक वैरिएबल फ़ोबिया विकसित करते हैं, और फिर हम सभी प्रकार की अहंकारी तकनीकों को वैश्विक वैरिएबल टैबू को दरकिनार करने के लिए तैयार किए जा रहे हैं, लेकिन समान प्रभाव प्राप्त करते हैं।
एवगेनी सर्गेव

38
नीचे मत कहना, "यह मत करो।" बिना स्पष्टीकरण दिए या बिना स्पष्टीकरण दिए।
जेफ मैककिन

4
@JeffMcCune: आपके कथन को स्पष्ट करने के लिए, "यह मत करो" वास्तव में बकवास है। जब यह उपयोगी हो तो इसे करें। उदाहरण के लिए, मुझे अपने कोड को कुछ IAbstractLoggerBullshit का उपयोग करके डिबग करना होगा और निश्चित रूप से सिस्टम। यह इस अतिरंजित वातावरण में काम नहीं करता है। मैं सैकड़ों बेकार एडेप्टर वर्गों के बीच लकड़हारा बकवास के आसपास गुजर मेरे कोड कूड़े नहीं कर सकते।
जो तो

6
मै इसको करने जा रहा हूँ।
फ्लोटिंग सनफिश

40

एक और तरीका इस तरह से एक इंटरफ़ेस बनाना है:

public interface GlobalConstants
{
  String name = "Chilly Billy";
  String address = "10 Chicken head Lane";
}

किसी भी वर्ग को जो उनका उपयोग करने की आवश्यकता है, उन्हें केवल इंटरफ़ेस लागू करना होगा:

public class GlobalImpl implements GlobalConstants
{
  public GlobalImpl()
  {
     System.out.println(name);
  }
}

मैं सोच रहा हूं कि इस उत्तर में (मेरे से पहले) कोई अप-वोट क्यों नहीं है। क्या यह अन्य सभी उत्तरों द्वारा प्रदान किए गए एक उचित वैकल्पिक उत्तर प्रदान नहीं करता है?
M_M

12
जोशुआ बलोच द्वारा प्रभावी जावा, अध्याय 4: कक्षाएं और इंटरफेस, आइटम 19: केवल परिभाषित करने के लिए इंटरफेस का उपयोग करें "निरंतर इंटरफ़ेस पैटर्न इंटरफेस का एक खराब उपयोग है।" यह पुस्तक पढ़ने के लिए बहुत उपयोगी है! :)
मैरीसस

1
इसके अलावा JDK 1.5+ से आप अपने वैश्विक चर के लिए स्थैतिक आयात का उपयोग कर सकते हैं, कार्यान्वयन की आवश्यकता नहीं है।
मैरीसस

9
.... ठीक है, यह वास्तव में कुछ भी नहीं समझाता है, कि बस यह कहता है कि कुछ किताब ने कहा कि यह बुरा था।
linkhyrule5

14
यहाँ आपके लिए एक उद्धरण है। ओरेकल का कहना है: "इसके चारों ओर पाने के लिए, लोग कभी-कभी स्थिर सदस्यों को एक इंटरफ़ेस में डालते हैं और उस इंटरफ़ेस से विरासत में मिलते हैं। यह एक बुरा विचार है। वास्तव में, यह इतना बुरा विचार है कि इसके लिए एक नाम है: कॉन्स्टेंट इंटरफ़ेस एंटीपैटर्न। (प्रभावी जावा आइटम 17 देखें)। समस्या यह है कि एक वर्ग के अन्य सदस्यों के स्थिर वर्ग का उपयोग एक मात्र कार्यान्वयन विवरण है। जब कोई वर्ग इंटरफ़ेस लागू करता है, तो वह कक्षा के सार्वजनिक एपीआई का हिस्सा बन जाता है। कार्यान्वयन विवरण लीक नहीं होना चाहिए। सार्वजनिक एपीआई। "
जोलता

23

आप निर्भरता इंजेक्शन का उपयोग कर बेहतर हैं:

public class Globals {
    public int a;
    public int b;
}

public class UsesGlobals {
    private final Globals globals;
    public UsesGlobals(Globals globals) {
        this.globals = globals;
    }
}

5
सच है, हालांकि मुझे लगता है कि "ग्लोबल्स" का आपका उपयोग चीजों को थोड़ा भ्रमित करता है :-)। "पैरामीटर" की तरह कुछ और अधिक उपयुक्त होगा क्योंकि यह आवश्यक नहीं है कि ग्लोबल हो।
मार्क पीटर्स

11

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

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

public class Global{
    private static int var = 5;

    public static int getVar(){
        return Global.var;
    }

    //If you do not want to change the var ever then do not include this
    public static void setVar(int var){
        Global.var = var;
    }
}

10

जावा में कोई वैश्विक चर नहीं है

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

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


9

सचमुच एक जावा ओओ कार्यक्रम में "ग्लोबल" की अवधारणा नहीं है

फिर भी आपके प्रश्न के पीछे कुछ सच्चाई है क्योंकि कुछ ऐसे मामले होंगे जहां आप कार्यक्रम के किसी भी भाग में एक विधि चलाना चाहते हैं। उदाहरण के लिए, Phrase-O-Matic ऐप में यादृच्छिक () विधि; यह एक विधि है जो किसी प्रोग्राम के किसी भी स्थान से कॉल करने योग्य होनी चाहिए।

तो उपरोक्त चीजों को संतुष्ट करने के लिए "हमें ग्लोबल-लाइक वैरिएबल्स और विधियां चाहिए"

वैश्विक रूप में एक भिन्न को घोषित करने के लिए।

 1.Mark the variable as public static final While declaring.

एक धातु के रूप में वैश्विक घोषित करने के लिए

 1. Mark the method as public static While declaring.

चूँकि मैंने वैश्विक चर और विधि को स्थिर के रूप में घोषित किया था इसलिए आप उन्हें निम्नलिखित कोड की मदद से अपनी इच्छा के अनुसार कहीं भी बुला सकते हैं

ClassName.X

नोट : X आवश्यकता के अनुसार विधि नाम या चर नाम हो सकता है और ClassName उस वर्ग का नाम है जिसमें आपने उन्हें घोषित किया था।


9

स्थिरांक को छोड़कर, कुछ भी वैश्विक नहीं होना चाहिए।

public class MyMainClass {
    public final static boolean DEBUGMODE=true;
}

इसे अपने मुख्य वर्ग के भीतर रखें। अन्य .java फाइलों में, इसके माध्यम से उपयोग करें:

if(MyMainClass.DEBUGMODE) System.out.println("Some debugging info");

सुनिश्चित करें कि जब आप कटिंग रूम के फर्श से अपना कोड हटाते हैं और रिलीज में आप इस कार्यक्षमता को हटाते हैं या टिप्पणी करते हैं।

यदि आपके पास एक वर्कहॉर्स विधि है, तो एक रैंडमाइज़र की तरह, मैं "टूलबॉक्स" पैकेज बनाने का सुझाव देता हूं! सभी कोडर्स में एक होना चाहिए, फिर जब भी आप इसे .java में उपयोग करना चाहते हैं, तो इसे आयात करें!


5

जावा में वास्तव में वैश्विक चर जैसी कोई चीज नहीं है। प्रत्येक स्थिर चर को किसी न किसी वर्ग (जैसे System.out) से संबंधित होना चाहिए, लेकिन जब आपने यह तय कर लिया है कि वह किस वर्ग में जाएगा, तो आप उसी कक्षा लोडर द्वारा लोड किए गए हर जगह से इसका उल्लेख कर सकते हैं।

ध्यान दें कि दौड़ की स्थिति से बचने के लिए अद्यतन करते समय स्थैतिक चर को हमेशा सुरक्षित रखना चाहिए।


1
जावा doesnt कार्यात्मक रूप से वैश्विक चर प्रदान करता है, लेकिन अगर आप एक वैश्विक चर अवधारणा चाहते हैं, तो हम स्थैतिक कीवर्ड का उपयोग कर सकते हैं
Abi

3
public class GlobalClass {
     public static int x = 37;
     public static String s = "aaa";
}

इस तरह से आप उनके साथ पहुँच सकते हैं GlobalClass.xऔरGlobalClass.s


2
public class GlobalImpl {   

 public static int global = 5;

}

आप कहीं भी कॉल कर सकते हैं:

GlobalImpl.global // 5

1

जैसा कि आप शायद उत्तर से अनुमान लगाते हैं कि जावा में कोई वैश्विक चर नहीं है और केवल एक चीज जो आप कर सकते हैं वह है स्थैतिक सदस्यों के साथ एक वर्ग बनाना:

public class Global {
    public static int a;
}

आप इसे Global.aकहीं और से इस्तेमाल कर सकते हैं । हालाँकि यदि आप जावा 1.5 या बेहतर का उपयोग करते हैं तो आप import staticजादू का उपयोग करके इसे वास्तविक वैश्विक चर के रूप में और भी अधिक देख सकते हैं:

import static test.Global.*;

public class UseGlobal {
    public void foo() {
        int i = a;
    }
}

और वॉयला !

अब यह एक सर्वोत्तम अभ्यास से बहुत दूर है, जैसा कि आप विज्ञापनों में देख सकते हैं: घर पर ऐसा न करें


1

जावा में कोई वैश्विक चर नहीं हैं, लेकिन सार्वजनिक क्षेत्रों के साथ वैश्विक कक्षाएं हैं। आप लगभग 5 वैरिएबल वैरिएबल की तरह दिखने के लिए जावा 5 के स्टैटिक इंपोर्ट फीचर का इस्तेमाल कर सकते हैं।


1

आम तौर पर ग्लोबल वेरिएबल (मुझे लगता है कि आप इसे C, Cpp से तुलना कर रहे हैं) के रूप में परिभाषित करते हैं public static final

पसंद

class GlobalConstant{
    public static final String CODE  = "cd";
}

ऐसे परिदृश्यों में भी उपयोगी हैं:

उदाहरण के लिए Calendar.JANUARY)


क्या वैश्विक वैरिएबल को अंतिम होना चाहिए? क्यों?
कोनरक

1
"फाइनल" का अर्थ है "स्थिर", इसलिए यह एक वैश्विक स्थिरांक है।
duffymo

1
नहीं, वैश्विक चर का मतलब क्या है अगर आप उस चर को साझा करना चाहते हैं और डेटा को बदलना चाहते हैं तो बस हटा दें, finalलेकिन यह निश्चित रूप से निर्भर करता है कि आप कैसे साझा करना चाहते हैं, जहां आप और सभी का उपयोग कर रहे हैं,
जिगर जोशी

CODEइस उदाहरण में क्या प्रकार है ? इसे कहां परिभाषित किया गया है?
M_M

यह भी नोट करें: CODE सभी कैप्स में है, क्योंकि इसके सामान्य जावा नोटेशन का उपयोग उन सभी चर के लिए किया जाता है जिन्हें आप अंतिम रूप में घोषित करते हैं, और प्रोग्राम के दौरान बदलने का इरादा नहीं रखते हैं।
डैन सिबोर्स्की - MSFT

1

एक स्वतंत्र फ़ाइल बनाना, जैसे। उदाहरण.जावा 1 समाधान का उपयोग करने के लिए, बस ठीक है। आप ऐसा ऐप के भीतर भी कर सकते हैं, यदि उदाहरण के लिए वैश्विक चर आपके मौजूदा ऐप के लिए विशेष हैं, आदि।:

शुरुआत में एक कक्षा बनाएँ और वहाँ अपने चर घोषित करें:

class Globals {
  static int month_number;
  static String month_name;
}

इसके बाद आप अपने ऐप में इन वेरिएबल्स - 'Globals.month_number' इत्यादि का उपयोग कर सकते हैं।


डाउनवोटिंग के बजाय, क्या आप मुझे बता सकते हैं कि इस समाधान में क्या गलत है? मैं इसे निरंतर आधार पर उपयोग कर रहा हूं और यह सबसे सुविधाजनक है। इसलिए मैं अन्यथा ऐसा नहीं कर सकता कि इस गिरावट को एक व्यक्तिगत चीज के रूप में माना जाए या सिर्फ एक बेवकूफ व्यक्ति द्वारा किया जाए।
अपोस्टोलोस

1

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

public class GlobalHolder {

    private static final GlobalHolder INSTANCE = new GlobalHolder();

    private volatile int globalProperty;

    public static GlobalHolder getInstance() {
        return INSTANCE;
    }

    public int getGlobalProperty() {
        return globalProperty;
    }

    public void setGlobalProperty(int globalProperty) {
        this.globalProperty = globalProperty;
    }

    public static void main(String[] args) {
        GlobalHolder.getInstance().setGlobalProperty(10);
        System.out.println(GlobalHolder.getInstance().getGlobalProperty());
    }
}

0

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

public class Add {
    static int a;
    static int b; 
    static int c;

    public static void main(String arg[]) {
        c=sum();
        System.out.println("Sum is: "+c); 
    }

    static int sum() {
       a=20;
       b=30;
       return a+b;   
    }
}

Output: Sum is: 50

उदाहरण चर से पहले स्थैतिक कीवर्ड का उपयोग करने के अलावा हमें एक ही चर के लिए डेटाटाइप्स को बार-बार निर्दिष्ट करने में सक्षम नहीं करते हैं। बस चर को सीधे लिखें।


1
जावा में कोई वैश्विक चर नहीं हैं; उन्हें उदाहरण चर के रूप में भी नहीं जाना जाता है; उन्हें परिभाषित करने के रूप में static'उन्हें पूरी तरह से उपलब्ध नहीं'। पहला पैराग्राफ बकवास है। उदाहरण खराब अभ्यास है।
लोर्ने के मार्किस

0

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


0

इसके बिना staticभी यह संभव है:

class Main {
  String globalVar = "Global Value";

  class Class1 {
    Class1() {
      System.out.println("Class1: "+globalVar);
      globalVar += " - changed";
  } }
  class Class2 {
    Class2() {
      System.out.println("Class2: "+globalVar);
  } }

  public static void main(String[] args) {  
    Main m = new Main();
    m.mainCode();
  }
  void mainCode() {
    Class1 o1 = new Class1();
    Class2 o2 = new Class2();
  }
}

/*
Output:
Class1: Global Value
Class2: Global Value - changed
*/

0

ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग को इस समझ के साथ बनाया गया है कि चर का दायरा उन क्लास ऑब्जेक्ट के करीब है जो उन वेरिएबल्स को घेरता है।

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

पहलू-उन्मुख प्रोग्रामिंग इस समस्या को "सलाह" नामक कुछ के माध्यम से मूल वर्ग के दायरे के प्रभारी द्वारा उपेक्षित करता है, जो वास्तव में इसे संशोधित किए बिना कोड में अतिरिक्त व्यवहार जोड़ता है। यह क्रॉस-कटिंग चिंताओं, या वैश्विक चर उपयोग के समाधान प्रदान करता है।

स्प्रिंग एक जावा फ्रेमवर्क है जो AOP का उपयोग करता है, और जब यह पारंपरिक रूप से वेब-अनुप्रयोगों के लिए उपयोग किया जाता है, तो कोर एप्लिकेशन को जावा फ्रेमवर्क (8.0 शामिल) में सार्वभौमिक रूप से उपयोग किया जा सकता है। यह एक दिशा हो सकती है जिसे आप और अधिक एक्सप्लोर करना चाहते हैं।


0

समस्या को समझना

मैं वैश्विक चर की योग्यता को एक चर के रूप में मानता हूं , जिसे कोड में स्थिर / आवृत्ति कॉल के बारे में परवाह किए बिना और किसी भी संदर्भ को एक वर्ग से दूसरे वर्ग में पारित किए बिना पहुँचा और बदला जा सकता है।

आमतौर पर अगर आपके पास ए क्लास है

public class A {
    private int myVar;

    public A(int myVar) {
        this.myVar = myVar;
    }

    public int getMyVar() {
        return myVar;
    }

    public void setMyVar(int mewVar) {
        this.myVar = newVar;
    }
}

और myvarकक्षा बी में पहुंच और अद्यतन करना चाहते हैं ,

public class B{

    private A a;

    public void passA(A a){
        this.a = a;
    }

    public void changeMyVar(int newVar){
        a.setMyvar(newVar);
    }
}

आपको कक्षा A के उदाहरण का संदर्भ देना होगा और कक्षा B में दिए गए मूल्य को इस तरह अपडेट करना होगा:

int initialValue = 2;
int newValue = 3;
A a = new A(initialValue);
B b = new B();
b.passA(a);
b.changeMyVar(newValue);
assertEquals(a.getMyVar(),newValue); // true

उपाय

तो मेरा यह समाधान, (भले ही मुझे यकीन नहीं है कि यह एक अच्छा अभ्यास है), एक सिंगलटन का उपयोग करना है:


public class Globals {
    private static Globals globalsInstance = new Globals();

    public static Globals getInstance() {
        return globalsInstance;
    }

    private int myVar = 2;

    private Globals() {
    }

    public int getMyVar() {
        return myVar;
    }

    public void setMyVar(int myVar) {
        this.myVar = myVar;
    }
}

अब आप के साथ कहीं भी वैश्विक अद्वितीय उदाहरण प्राप्त कर सकते हैं:

Globals globals = Globals.getInstance();
// and read and write to myVar with the getter and setter like 
int myVar = globals.getMyVar();
global.setMyVar(3);

-1
// Get the access of global while retaining priveleges.
// You can access variables in one class from another, with provisions.
// The primitive must be protected or no modifier (seen in example).

// the first class
public class farm{

  int eggs; // an integer to be set by constructor
  fox afox; // declaration of a fox object

  // the constructor inits
  farm(){
    eggs = 4;
    afox = new fox(); // an instance of a fox object

    // show count of eggs before the fox arrives
    System.out.println("Count of eggs before: " + eggs);

    // call class fox, afox method, pass myFarm as a reference
    afox.stealEgg(this);

    // show the farm class, myFarm, primitive value
    System.out.println("Count of eggs after : " + eggs);

  } // end constructor

  public static void main(String[] args){

    // instance of a farm class object
    farm myFarm = new farm();

  }; // end main

} // end class

// the second class
public class fox{

  // theFarm is the myFarm object instance
  // any public, protected, or "no modifier" variable is accessible
  void stealEgg(farm theFarm){ --theFarm.eggs; }

} // end class

2
यह उत्तर क्या जोड़ता है कि अन्य उत्तर नहीं देते हैं? मैं इस उत्तर में कोई "नया" मान नहीं देख सकता।
ईवित

-2

ग्लोबल वेरिएबल को परिभाषित करने के लिए आप स्टेटिक कीवर्ड का उपयोग कर सकते हैं

public final class Tools {
  public static int a;
  public static int b;
}

अब आप कॉल करके कहीं से भी ए और बी एक्सेस कर सकते हैं

Tools.a;
Tools.b;

Yoy सही हैं ... विशेष रूप से J2ME में ... आप अपने मिडल कंस्ट्रक्टर (प्रोग्री इनिशियलाइज़ेशन) की इस लाइन के अंदर डालकर NullPointerException से बच सकते हैं:

new Tools();

यह सुनिश्चित करता है कि टूल्स का उपयोग करने वाले किसी भी निर्देश से पहले आवंटित किया जाएगा।

बस!


3
उम ... क्षमा करें, लेकिन यह क्या जोड़ता है जो पहले से मौजूद उत्तरों से कवर नहीं है?
1

हो सकता है कि आप सही हों..लेकिन यह जवाब स्मृति आवंटन जैसी चीजों की व्याख्या करता है।
user2616742

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