জাভাতে কোন শ্রেণি আক্রমণকারী কী?


94

আমি বিষয়টি গুগল করেছিলাম, তবে উইকিপিডিয়া ছাড়াও আমি আর কোনও দরকারী ডকুমেন্টেশন বা নিবন্ধগুলি পাই নি।

কেউ কি এর সহজ অর্থ আমাকে সরল কথায় ব্যাখ্যা করতে পারে বা আমাকে কিছু সুন্দর এবং সহজে বোঝার জন্য ডকুমেন্টেশনগুলিতে উল্লেখ করতে পারে?


4
প্রশ্নের জন্য +1 কারণ উইকিপিডিয়া পৃষ্ঠায় এমন কোনও কিছুর একটি দুর্দান্ত উদাহরণ রয়েছে যা আমি জানতাম না যে আপনি করতে পারেন - এটির উদাহরণও রয়েছে। তাদের ব্যাখ্যাটি যদিও আমি আপনার পক্ষে করতে পারি তার চেয়ে ভাল; এটা বেশ সোজা।
iandisme


যদি আপনি আগ্রাসী জাভা জাভাতে আগ্রহী হন তবে সম্ভবত আপনি জাভা চুক্তিতে আগ্রহী হবেন ।
মাইক স্যামুয়েল

4
আরো সহজ ব্যাখ্যা - < stackoverflow.com/questions/112064/what-is-an-invariant?rq=1 >
ip_x

উত্তর:


93

জাভা সম্পর্কিত উল্লেখ করে এটির অর্থ নির্দিষ্ট নয়।

একটি শ্রেণীর আক্রমণকারী হ'ল এমন একটি সম্পত্তি যা কোনও শ্রেণীর সমস্ত দৃষ্টান্ত ধরে রাখে, সর্বদা, অন্য কোড যাই করুক না কেন।

উদাহরণ স্বরূপ,

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

X এর শ্রেণি আক্রমণকারী রয়েছে যে এখানে একটি yসম্পত্তি আছে এবং এটি কখনও হয় না nullএবং এর ধরণের মান থাকে Y

class Counter {
  private int x;

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

দুটি গুরুত্বপূর্ণ আক্রমণকারী বজায় রাখতে ব্যর্থ

  1. countসম্ভাব্য ভূগর্ভের কারণে এটি কখনও নেতিবাচক মান দেয় না।
  2. যে আহ্বান countকঠোরভাবে একঘেয়েমি বৃদ্ধি পাচ্ছে।

পরিবর্তিত শ্রেণি two দুটি আক্রমণকারীকে সংরক্ষণ করে।

class Counter {
  private int x;

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

তবে আক্রমণকারীটিকে সংরক্ষণ করতে ব্যর্থ হয় যা countসর্বদা সাধারনত সফল হওয়ার আহ্বান জানায় (অনুপস্থিত টিসিবি-লঙ্ঘন ) কারণ countএকটি ব্যতিক্রম ছুঁড়ে দিতে পারে বা যদি কোনও ডেডলকড থ্রেড কাউন্টারটির মনিটরের মালিক হয় তবে এটি ব্লক হতে পারে।

ক্লাস সহ প্রতিটি ভাষা কিছু শ্রেণীর আক্রমণকারী বজায় রাখা সহজ করে তবে অন্যকে নয়। জাভা এর ব্যতিক্রম নয়:

  1. জাভা ক্লাসে ধারাবাহিকভাবে বৈশিষ্ট্য এবং পদ্ধতি থাকে বা থাকে না, সুতরাং ইন্টারফেসের আক্রমণকারীগুলি বজায় রাখা সহজ।
  2. জাভা ক্লাসগুলি তাদের privateক্ষেত্রগুলি রক্ষা করতে পারে , তাই ব্যক্তিগত ডেটা নির্ভর করে এমন আক্রমণকারীগুলি বজায় রাখা সহজ।
  3. জাভা ক্লাসগুলি চূড়ান্ত হতে পারে, সুতরাং আক্রমণকারীরা কোনও দূষিত সাবক্লাস তৈরি করে কোনও আক্রমণকারীকে লঙ্ঘন করে এমন কোনও কোড না থাকার উপর নির্ভর করে।
  4. জাভা nullমানগুলি বিভিন্ন উপায়ে ডুবে যেতে দেয় , সুতরাং "সত্যিকারের মূল্য আছে" আক্রমণকারীদের ধরে রাখা শক্ত tough
  5. জাভাতে থ্রেড রয়েছে যার অর্থ যে ক্লাসগুলি সিঙ্ক্রোনাইজ হয় না তাদের আক্রমণকারীগুলি বজায় রাখতে সমস্যা হয় যা একত্রে ঘটে যাওয়া থ্রেডে ক্রমক্রমিক ক্রিয়ায় নির্ভর করে।
  6. জাভাতে ব্যতিক্রম রয়েছে যা "সম্পত্তি পি দিয়ে ফলাফল দেয় বা কোনও ফল দেয় না" এর মতো আক্রমণকারীগুলি বজায় রাখা সহজ করে তোলে তবে "সর্বদা ফল দেয়" এর মতো আক্রমণকারী বজায় রাখা আরও শক্ত।

† - একটি বাহ্যিকতা বা টিসিবি লঙ্ঘন এমন একটি ইভেন্ট যা কোনও সিস্টেম ডিজাইনার আশাবাদীভাবে ধরে নেয় যে ঘটবে না।

সাধারণত আমরা কেবলমাত্র বিশ্বাস করি যে তাদের উপর নির্মিত উচ্চ-স্তরের ভাষার বৈশিষ্ট্যগুলির বিষয়ে কথা বলার সময় বেসিক হার্ডওয়্যার বিজ্ঞাপন হিসাবে কাজ করে, এবং আমাদের আর্গুমেন্টরা যে যুক্তিগুলি ধারণ করে তা এর সম্ভাব্যতার বিষয়টি বিবেচনা করে না:

  • কোনও প্রোগ্রামার সেই প্রোগ্রামটি যেভাবে চালাতে পারে না সেভাবে চালিত হওয়ার সাথে সাথে স্থানীয় ভেরিয়েবলগুলিকে পরিবর্তন করতে ডিবাগ হুক ব্যবহার করে।
  • আপনার সহকর্মীরা লুকিং টেবিলগুলি setAccessibleসংশোধন করতে প্রতিচ্ছবি ব্যবহার করবেন না private
  • লোকি পরিবর্তিত পদার্থবিদ্যার কারণে আপনার প্রসেসরের ভুল করে দুটি সংখ্যার তুলনা করা যায়।

কিছু সিস্টেমের জন্য আমাদের টিসিবি সিস্টেমের কেবলমাত্র অংশগুলি অন্তর্ভুক্ত করতে পারে, তাই আমরা এটি ধরে নিতে পারি না

  • কোনও প্রশাসক বা সুবিধাভোগী ডিমন আমাদের জেভিএম প্রক্রিয়াটিকে হত্যা করবে না,

তবে আমরা এটি ধরে নিতে পারি

  • আমরা একটি নির্ভরযোগ্য ট্রানজেকশনাল ফাইল-সিস্টেমের চেকপয়েন্ট করতে পারি।

একটি উচ্চ স্তরের একটি সিস্টেম, এর টিসিবি সাধারণত বৃহত্তর হয় তবে আপনি আপনার টিসিবি থেকে যত বেশি অবিশ্বাস্য জিনিসগুলি বের করতে পারবেন, আপনার আক্রমণকারীরা তত বেশি সম্ভাবনাময় হবেন এবং আপনার সিস্টেমটি দীর্ঘ সময়ের মধ্যে আরও নির্ভরযোগ্য হবে।


4
"যা countকখনই একই মান দুবার ফেরত দেয় না" সত্যই কোনও শ্রেণীর আক্রমণকারী হিসাবে বিবেচিত?
রুখ

4
@রুখ, এটি একটি ভাল প্রশ্ন। আমি পুরোপুরি নিশ্চিত না. হ্যাশকোড স্থিতিশীলতার মতো বিষয়গুলি (প্রতিটি উদাহরণের জন্য i, i.hashCode () পরিবর্তিত হয় না) প্রায়শই শ্রেণীর আক্রমণকারী বলা হয় যার জন্য পূর্বে ফিরে আসা মানগুলি সম্পর্কে যুক্তি প্রয়োজন, সুতরাং "প্রতিটি উদাহরণের জন্য i, i.count () বলা যুক্তিযুক্ত বলে মনে হয় নয় (আইকাউন্টের পূর্ববর্তী ফলাফল ()) "এটি একটি শ্রেণীর আক্রমণকারী।
মাইক স্যামুয়েল

@ruakh এটি কি খাঁটি সংজ্ঞা নয়? আমি যদি এ জাতীয় আক্রমণকারী পোষ্ট করি তবে কেন হয় না? এটি অবশ্যই একটি আকর্ষণীয় এবং গুরুত্বপূর্ণ গ্যারান্টি হতে পারে (অনন্য আইডি তৈরির জন্য বলুন)। ব্যক্তিগতভাবে আমি আরও কিছু মনে করি "যদি কেবলমাত্র একক থ্রেড কোডগুলি এই শ্রেণিতে অ্যাক্সেস করে, নিম্নলিখিত বৈশিষ্ট্যগুলি ধারণ করবে" দরকারী তবে আমি নিশ্চিত নই যে এটি সংজ্ঞাটি এমনভাবে প্রসারিত করা সম্ভব যে এটি কেবল নির্দিষ্ট সময় ধরে রাখতে হবে। শর্ত সত্য। (এবং প্রতিচ্ছবি বিবেচনা করে অন্যথায় আকর্ষণীয় কোনও কিছুর গ্যারান্টি দেওয়া অসম্ভব!)
ভু

4
@রুখ - আপনি এটিকে শ্রেণিবদ্ধ বা কোনও পদ্ধতিতে আক্রমণকারী হিসাবে মডেল করতে পারেন। যে কোনও উপায়ে, এটির মডেলিংয়ের জন্য কোনও নির্দিষ্ট অবজেক্টের পদ্ধতিতে পূর্ববর্তী কলগুলির ধারণাগত ইতিহাস প্রয়োজন। প্রকৃতপক্ষে, আপনি এমনকি এই পদ্ধতিতে একটি পোস্ট শর্ত হিসাবে মডেল করতে পারেন; অর্থাত্ ফলাফলের মানটি এমনটি যা আগে ফিরে আসে নি।
স্টিফেন সি

@ ভু: রে: "এটি কি খাঁটি সংজ্ঞায়িত জিনিস নয়?": অবশ্যই, তবে যেহেতু এখানে প্রশ্নটি হল, "'শ্রেণি আগ্রাসক' কী?", আমি মনে করি সংজ্ঞাটি 100% প্রাসঙ্গিক। স্পষ্ট-কাট উদাহরণগুলি ব্যবহার করা বা অন্যথায় পরিষ্কার-না-কাট-আইটুডের ক্ষেত্রে স্পষ্টভাবে কল করা ভাল বলে মনে হয় possible (আমি উদাহরণের সাথে সক্রিয়ভাবে একমত নই, উপায় দ্বারা; আমি এটি দ্বারা আশ্চর্য হয়েছি, এবং এটি নিশ্চিত করার জন্য জিজ্ঞাসা করছি।)
রুখ

21

আক্রমণকারী বলতে এমন কিছু বোঝায় যা তার অবস্থার সাথে আটকে থাকুক না কেন যে পরিবর্তনই হোক বা যে কেউ এটিকে ব্যবহার / রূপান্তর করে। এর অর্থ হ'ল, কোনও শ্রেণীর সম্পত্তি সর্বদা জনসাধারণের পদ্ধতি ব্যবহার করে রূপান্তরের মধ্য দিয়ে যাওয়ার পরেও কিছু শর্ত পূরণ করে বা সন্তুষ্ট করে। সুতরাং, এই শ্রেণীর ক্লায়েন্ট বা ব্যবহারকারী শ্রেণি এবং তার সম্পত্তি সম্পর্কে নিশ্চিত।

উদাহরণ স্বরূপ,

  1. ফাংশন আর্গুমেন্টের শর্তটি হ'ল, এটি সর্বদা> 0 (শূন্যের চেয়ে বড়) হওয়া উচিত বা শূন্য হওয়া উচিত নয়।
  2. অ্যাকাউন্ট অ্যাকাউন্ট শ্রেণীর ন্যূনতম_ অ্যাকাউন্ট_সাম্যহীন সম্পত্তি, এটি 100 এর নিচে যেতে পারে না So সুতরাং সমস্ত জনসাধারণের কাজকর্মের উচিত এই শর্তটি সম্মান করা এবং শ্রেণীর আক্রমণকারীকে নিশ্চিত করা।
  3. ভেরিয়েবলের মধ্যে রুল ভিত্তিক নির্ভরতা, অর্থাৎ, একটি ভেরিয়েবলের মান অন্যটির উপর নির্ভর করে, তাই যদি কিছু পরিবর্তন-নিয়ম ব্যবহার করে অন্য পরিবর্তন হয় তবে অন্যটিও পরিবর্তন করতে হবে। 2 ভেরিয়েবলের মধ্যে এই সম্পর্ক অবশ্যই সংরক্ষণ করা উচিত। যদি এটি না হয়, তবে আক্রমণকারী লঙ্ঘন করা হয়।

11

এগুলি এমন ঘটনা যা একটি উদাহরণ শ্রেণীর ক্ষেত্রে অবশ্যই সত্য। উদাহরণস্বরূপ, যদি কোনও শ্রেণীর সম্পত্তির এক্স থাকে এবং ইনগ্রান্টের পরিমাণটি এক্স এর চেয়ে বড় হতে পারে তবে 0. আমার জ্ঞান অনুসারে আক্রমণকারীদের রক্ষণাবেক্ষণের জন্য কোনও বিল্ট-ইন পদ্ধতি নেই আপনাকে অবশ্যই সম্পত্তি ব্যক্তিগত রাখতে হবে এবং নিশ্চিত হওয়া উচিত যে আপনার গ্রাহকরা এবং সেটটাররা ইনভারিয়েন্স সম্পত্তি প্রয়োগ করে।

এমন টীকা উপলব্ধ রয়েছে যা প্রতিবিম্ব এবং ইন্টারসেপ্টর ব্যবহার করে বৈশিষ্ট্যগুলি পরীক্ষা করতে পারে। http://docs.oracle.com/javaee/7/api/javax/omotation/constraints/package-summary.html

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.