जावा में एक वर्ग आक्रमणकारी क्या है?


93

मैंने इस विषय पर ध्यान दिया, लेकिन विकिपीडिया के अलावा मुझे कोई और उपयोगी दस्तावेज या लेख नहीं मिला।

क्या कोई मुझे सरल शब्दों में समझा सकता है कि इसका क्या अर्थ है या मुझे कुछ अच्छे और आसान दस्तावेज़ों को समझने के लिए संदर्भित करें?


2
प्रश्न के लिए +1 क्योंकि विकिपीडिया पृष्ठ में किसी ऐसी चीज़ का बहुत बड़ा उदाहरण है जो मुझे नहीं पता था कि आप कर सकते हैं - इसके उदाहरण भी हैं। यद्यपि मैं आपके लिए कर सकता हूं, उनकी व्याख्या बेहतर है; यह बहुत सीधा है।
इयानीदिस्म 22


यदि आप invariants में रुचि रखते हैं जावा, शायद आप जावा के लिए अनुबंधों में रुचि रखते हैं ।
माइक सैमुअल

1
एक और अधिक सरल व्याख्या - < stackoverflow.com/questions/112064/what-is-an-invariant?rq=1 >
ip_x

जवाबों:


91

यह विशेष रूप से जावा के संदर्भ में कुछ भी मतलब नहीं है।

एक वर्ग अयोग्य बस एक संपत्ति है जो एक वर्ग के सभी उदाहरणों के लिए है, हमेशा, कोई फर्क नहीं पड़ता कि अन्य कोड क्या करता है।

उदाहरण के लिए,

class X {
  final Y y = new Y();
}

एक्स के पास वर्ग अयोग्य है कि एक yसंपत्ति है और यह कभी नहीं है nullऔर इसका प्रकार का मूल्य है Y

class Counter {
  private int x;

  public int count() { return x++; }
}

दो महत्वपूर्ण आक्रमणकारियों को बनाए रखने में विफल रहता है

  1. countसंभावित बहाव के कारण इसका नकारात्मक मान कभी नहीं लौटता है।
  2. यह countपुख्ता तौर पर नीरस वृद्धि करने वाली कॉल हैं।

संशोधित वर्ग उन दो आक्रमणकारियों को संरक्षित करता है।

class Counter {
  private int x;

  public synchronized int count() {
    if (x == Integer.MAX_VALUE) { throw new IllegalStateException(); }
    return x++;
  }
}

लेकिन अपरिवर्तनीय को संरक्षित करने में विफल रहता है जो countसामान्य रूप से हमेशा सफल होने के लिए कहता है (अनुपस्थित टीसीबी-उल्लंघन ) the क्योंकि countएक अपवाद फेंक सकता है या यह ब्लॉक हो सकता है यदि कोई डेडलॉक धागा काउंटर के मॉनिटर का मालिक है।

कक्षाओं के साथ प्रत्येक भाषा कुछ वर्ग के आक्रमणकारियों को बनाए रखना आसान बनाती है, लेकिन दूसरों को नहीं। जावा कोई अपवाद नहीं है:

  1. जावा कक्षाओं में लगातार गुण या विधियां नहीं होती हैं, इसलिए इंटरफ़ेस आक्रमणकारियों को बनाए रखना आसान होता है।
  2. जावा कक्षाएं अपने privateक्षेत्रों की रक्षा कर सकती हैं, इसलिए निजी डेटा पर भरोसा करने वाले आक्रमणकारियों को बनाए रखना आसान है।
  3. जावा कक्षाएं अंतिम हो सकती हैं, इसलिए आक्रमणकारी जो इस बात पर भरोसा करते हैं कि कोई कोड नहीं है जो एक दुर्भावनापूर्ण उपवर्ग का निर्माण करके किसी आक्रमणकारी का उल्लंघन करता है, उसे बनाए रखा जा सकता है।
  4. जावा nullकई मायनों में मूल्यों को छलनी करने की अनुमति देता है, इसलिए इसे बनाए रखने के लिए कठिन है "एक वास्तविक मूल्य" अपरिवर्तनीय है।
  5. जावा में थ्रेड्स होते हैं, जिसका अर्थ है कि जो कक्षाएं सिंक्रनाइज़ नहीं होती हैं, उन्हें एक साथ होने वाले थ्रेड में अनुक्रमिक संचालन पर भरोसा करने वाले आक्रमणकारियों को बनाए रखने में परेशानी होती है।
  6. जावा में ऐसे अपवाद हैं, जो "हमेशा संपत्ति पी के साथ एक परिणाम देता है या कोई परिणाम नहीं देता है" जैसे आक्रमणकारियों को बनाए रखना आसान बनाता है, लेकिन "हमेशा परिणाम देता है" जैसे आक्रमणकारियों को बनाए रखना मुश्किल होता है।

† - एक बाह्यता या TCB उल्लंघन एक घटना है जो एक सिस्टम डिजाइनर आशावादी मान लिया गया है नहीं होगा है।

आमतौर पर हम सिर्फ इस बात पर भरोसा करते हैं कि मूल हार्डवेयर विज्ञापन के रूप में काम करता है जब उन पर निर्मित उच्च-स्तरीय भाषाओं के गुणों के बारे में बात की जाती है, और हमारे तर्क जो आक्रमण करते हैं, वे इसकी संभावना को ध्यान में नहीं रखते हैं:

  • एक प्रोग्रामर डिबग हुक का उपयोग करके स्थानीय चर को प्रोग्राम के रूप में बदल सकता है जो कोड नहीं कर सकता है।
  • आपके साथी लुकअप टेबल setAccessibleको संशोधित करने के लिए प्रतिबिंब का उपयोग नहीं करते हैं private
  • लोकी ने भौतिकी को बदल दिया जिससे आपके प्रोसेसर को दो नंबरों की तुलना गलत तरीके से करनी पड़ी।

कुछ प्रणालियों के लिए हमारे TCB में सिस्टम के कुछ भाग शामिल हो सकते हैं, इसलिए हम ऐसा नहीं मान सकते

  • एक व्यवस्थापक या विशेषाधिकार प्राप्त डेमन हमारी JVM प्रक्रिया को नहीं मारेंगे,

लेकिन हम यह मान सकते हैं

  • हम एक विश्वसनीय ट्रांसेक्शनल फाइल-सिस्टम की जांच कर सकते हैं।

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


1
क्या "जो countदो बार एक ही मूल्य नहीं देता है" वास्तव में एक वर्ग अयोग्य माना जाता है?
रक्ख

@ruakh, यह एक अच्छा सवाल है। मुझे पक्का यकीन नहीं है। हैशकोड स्थिरता (प्रत्येक उदाहरण के लिए, i.hashCode () नहीं बदलता है) जैसी चीजों को अक्सर क्लास इनवेरिएंट कहा जाता है, जिन्हें पहले लौटे मूल्यों के बारे में तर्क की आवश्यकता होती है, इसलिए यह कहना उचित लगता है कि "प्रत्येक उदाहरण के लिए, i.count () नहीं (i.count ()) के पिछले परिणामों में "एक वर्ग अयोग्य है।
माइक सैमुअल

@ruakh यह शुद्ध परिभाषा वाली बात नहीं है? यदि मैं इस तरह के एक अपरिवर्तनीय को पोस्ट करता हूं, तो क्यों नहीं? यह निश्चित रूप से एक दिलचस्प और महत्वपूर्ण गारंटी हो सकती है (अद्वितीय आईडी बनाने के लिए कहते हैं)। व्यक्तिगत रूप से मुझे भी कुछ ऐसा ही लगता है "यदि केवल एकल थ्रेडेड कोड इस वर्ग तक पहुँचता है, तो निम्नलिखित गुण धारण करेंगे" उपयोगी है, लेकिन मुझे यकीन नहीं है कि अगर इस तरह से परिभाषा का विस्तार करना संभव है तो इसे केवल कुछ समय के लिए पकड़ना होगा। स्थितियां सत्य हैं। (और प्रतिबिंब को देखते हुए यह मूल रूप से असंभव है कि किसी भी चीज़ की दिलचस्प गारंटी दी जाए!)
वू १12

1
@ruakh - आप इसे एक वर्ग अशुभ या एक विधि अक्रियाकार के रूप में मॉडल कर सकते हैं। किसी भी तरह से, मॉडलिंग को एक विशिष्ट वस्तु पर विधि के लिए पिछले कॉल के वैचारिक इतिहास की आवश्यकता होती है। वास्तव में, आप इसे पद्धति पर पोस्ट-कंडीशन के रूप में भी मॉडल कर सकते हैं; इसका मतलब यह है कि परिणाम मूल्य वह है जिसे पहले नहीं लौटाया गया है।
स्टीफन सी

@Voo: पुन: "यह एक शुद्ध परिभाषा वाली बात नहीं है?": निश्चित रूप से, लेकिन जब से यहाँ सवाल है, "एक 'क्लास इनवेरिएंट' क्या है?", मुझे लगता है कि परिभाषा 100% प्रासंगिक है। यह संभव लगता है, स्पष्ट सीमा तक उदाहरणों का उपयोग करने के लिए, या स्पष्ट रूप से गैर-स्पष्ट-कट-इट के मामलों को स्पष्ट रूप से कॉल करने के लिए। (मैं उदाहरण के साथ सक्रिय रूप से असहमत नहीं हूं; मैं बस इससे आश्चर्यचकित था, और यह सुनिश्चित करने के लिए पूछ रहा था।)
बर्बाद

20

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

उदाहरण के लिए,

  1. फ़ंक्शन तर्क पर शर्त यह है कि, यह हमेशा 0 (शून्य से अधिक) होना चाहिए या शून्य नहीं होना चाहिए।
  2. खाता श्रेणी के राज्यों की न्यूनतम_सहायक संपत्ति, यह 100 से नीचे नहीं जा सकती है। इसलिए सभी सार्वजनिक कार्यों को इस शर्त का सम्मान करना चाहिए और वर्ग को सुनिश्चित करना चाहिए।
  3. चरों के बीच नियम आधारित निर्भरता, यानी एक चर का मूल्य दूसरे पर निर्भर करता है, इसलिए यदि कोई परिवर्तन करता है, तो कुछ फिक्स-नियम का उपयोग करते हुए, दूसरे को भी बदलना होगा। 2 चर के बीच के इस संबंध को संरक्षित किया जाना चाहिए। यदि ऐसा नहीं होता है, तो आक्रमणकारी का उल्लंघन किया जाता है।

11

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

एनोटेशन उपलब्ध हैं जो प्रतिबिंब और इंटरसेप्टर का उपयोग करके गुणों की जांच कर सकते हैं। http://docs.oracle.com/javaee/7/api/javax/validation/constraints/package-summary.html

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