2009-06-09 14 views
5

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

class foo 
{ 

    private Object bar; 

    public foo(Object pBar) 
    { 
    if(pBar == null) 
    { 
     bar = new Object(); 
    } 
    else 
    { 
     bar = pBar 
    } 
    } 

    // I DO NOT WANT ANYONE TO MODIFY THE VALUE OF bar OUT OF THE CONSTRUCTOR 

} 

उत्तर

16

घोषित barfinal, इस तरह बनना:

private final Object bar; 
7

आप कीवर्ड फाइनल के लिए देख रहे हैं।

class foo 
{ 
    private final Object bar; 

    public foo(Object pBar) 
    { 
     //Error check so that pBar is not null 
     //If it's not, set bar to pBar 
     bar = pBar; 
    } 
} 

अब बार बदला नहीं जा सकता

6

दोनों पिछले जवाब सही हैं, लेकिन अभी भी pBar अशक्त करने के लिए सेट किया जा सकता है:

new foo(null); 

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

public class Foo 
{ 
    private final Object bar; 

    public Foo(Object pBar) 
    { 
     if (pBar == null) 
     { 
      bar = new Object(); 
     }else{ 
      bar = pBar; 
     } 
    } 
} 
+1

+1, लेकिन मुझे लगता है कि एक नया ऑब्जेक्ट() चुपचाप असाइन करने के बजाय अपवाद फेंकना या जोर देना बेहतर होगा। –

1

आप फ़ील्ड को अंतिम के रूप में घोषित करना चाहते हैं, उदाहरण के लिए ।

private final Object foo; 

इसमें अतिरिक्त लाभ है w.r.t. कंसूरेंसी क्षेत्र को कन्स्ट्रक्टर समाप्त होने के बाद शुरू करने की गारंटी है।

ध्यान दें कि यह केवल वस्तु को दूसरे स्थानांतरित करने से रोकता है। यह वस्तु के तरीकों से ऑब्जेक्ट में संशोधन को रोकता नहीं है, उदा। सेटर्स, सी/सी ++ में कॉन्स के विपरीत।

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