2014-09-02 5 views
6

जब मैं ग्रोवी कंसोल में नीचे दिए गए कोड को निष्पादित करता हूं, तो मुझे groovy.lang.ReadOnlyPropertyException मिलता है। जैसा कि अपेक्षित है कि संपत्ति एक्स को बदलने के लिए संभव नहीं होना चाहिए (ClassA अपरिवर्तनीय है)।ग्रोवी में @Imututable कैसे काम करता है?

import groovy.transform.Immutable 
@Immutable class ClassA { 
    int x 
} 

def a = new ClassA(x: 5); 
a.x = 1 

लेकिन अगर परिवर्तन x चर के लिए निजी के लिए उपयोग संशोधक, तो मैं ग्रूवी कंसोल में इस पर अमल कर सकते हैं:

import groovy.transform.Immutable 
@Immutable class ClassA { 
    private int x 
} 

def a = new ClassA(x: 5); 
a.x = 1 
println(a.x) 

ऐसा क्यों है? जोड़ा गया private एक्सेस संशोधक ClassA उत्परिवर्तनीय क्यों बनाता है?

उत्तर

8

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

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

इस के लिए एक मामूली संकेतक तथ्य यह है कि toString ऐसी कक्षाओं के लिए बनाया गया है। उदा .:

@groovy.transform.Immutable 
class A { 
    private int a 
} 

@groovy.transform.Immutable 
class B { 
    int b 
} 

a=new A() 
a.a = 42 
println a 
b=new B() 
// b.b = 42 
println b 

प्रिंट होगा:

A() 
B(0) 

दिखा, कि [email protected] अचल स्थिति के लिए "गणना" ("महत्वपूर्ण राज्य") का हिस्सा नहीं है। और जैसा कि आप ग्रोवी में निजी वर्र्स तक पहुंच सकते हैं, ऊपर दिया गया आपका कोड ठीक काम करता है।

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