পরিবর্তনীয় বনাম অপরিবর্তনীয় বস্তু


173

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


stringঅন্তত। নেট এ অপরিবর্তনীয় এবং আমি অন্যান্য অনেক আধুনিক ভাষায়ও ভাবি।
ডোমেনিক

4
এটি স্ট্রিং ভাষাতে আসলে কী তার উপর নির্ভর করে - এরং 'স্ট্রিংস' কেবল একটি ইনটসের অ্যারে এবং হ্যাশেল "স্ট্রিংস" হল অক্ষরের অ্যারে।
চিআই

4
রুবি স্ট্রিংগুলি বাইটের একটি পরিবর্তনীয় অ্যারে। একেবারে আমাকে বাদাম চালায় যে আপনি সেগুলিকে জায়গায় স্থান দিতে পারেন।
ড্যানিয়েল স্পিওক

6
ড্যানিয়েল - কেন? আপনি কি নিজেকে দুর্ঘটনাক্রমে এটি করতে দেখছেন?

5
@ ড্যানিয়েলস্পিউক বাদাম চালিত হওয়ার জন্য সমাধান যা আপনি জায়গায় স্ট্রিং পরিবর্তন করতে পারেন তা সহজ: কেবল এটি করবেন না। বাদাম চালিত হওয়ার সমাধান কারণ আপনি জায়গায় স্ট্রিং পরিবর্তন করতে পারবেন না এটি সহজ নয়।
কাজ

উত্তর:


162

ঠিক আছে, এটির কয়েকটি দিক রয়েছে।

  1. রেফারেন্স-পরিচয় ব্যতীত মিউটেবল অবজেক্টগুলি বিজোড় সময়ে বাগের কারণ হতে পারে। উদাহরণস্বরূপ, Personএকটি মান-ভিত্তিক equalsপদ্ধতি সহ একটি শিম বিবেচনা করুন :

    Map<Person, String> map = ...
    Person p = new Person();
    map.put(p, "Hey, there!");
    
    p.setName("Daniel");
    map.get(p);       // => null
    

    Personউদাহরণ হিসেবে বলা যায় যখন কারণ এটির একটি কী হিসাবে ব্যবহার "হারানো" মানচিত্র পায় hashCodeএবং সমতার চপল মান উপর ভিত্তি করে করা হয়েছে। মানচিত্রের বাইরের মানগুলি পরিবর্তিত হয়ে গেছে এবং সমস্ত হ্যাশিং অচল হয়ে গেছে। তাত্ত্বিকরা এই বিষয়টিতে বীণা বানাতে পছন্দ করেন তবে বাস্তবে আমি এটি খুব বেশি ইস্যুতে পাইনি।

  2. আর একটি দিক হ'ল আপনার কোডের যৌক্তিক "যুক্তিযোগ্যতা"। এটি পাঠ্যযোগ্যতা থেকে প্রবাহের সমস্ত কিছুর অন্তর্ভুক্ত সংজ্ঞা দেওয়ার পক্ষে একটি শক্ত শব্দ। সাধারণভাবে, আপনার কোডের একটি অংশটি দেখার এবং এটি কী করে তা সহজেই বুঝতে সক্ষম হওয়া উচিত। তবে এর চেয়েও গুরুত্বপূর্ণ, আপনার নিজেরকে বোঝাতে সক্ষম হওয়া উচিত যে এটি সঠিকভাবে যা করে তা করে । বিভিন্ন কোড "ডোমেনস" জুড়ে যখন অবজেক্টস স্বাধীনভাবে পরিবর্তন করতে পারে তখন কখনও কখনও কোথায় এবং কেন (" দূরত্বে ভুতুড়ে কর্ম ") এর ট্র্যাক রাখা খুব কঠিন হয়ে পড়ে । এটি উদাহরণ সহকারে আরও কঠিন ধারণা, তবে এটি এমন কিছু যা প্রায়শই বৃহত্তর, আরও জটিল আর্কিটেকচারের মুখোমুখি হয়।

  3. অবশেষে, পরিবর্তনীয় অবজেক্টগুলি সাম্প্রতিক পরিস্থিতিতে খুনি । আপনি যখনই পৃথক থ্রেড থেকে কোনও পরিবর্তনযোগ্য বস্তু অ্যাক্সেস করতে পারেন, আপনাকে লকিংয়ের সাথে ডিল করতে হবে। এটি থ্রুপুট হ্রাস করে এবং আপনার কোড বজায় রাখা নাটকীয়ভাবে আরও জটিল করে তোলে । একটি পর্যাপ্ত জটিল সিস্টেম অনুপাতের বাইরে এ সমস্যাটি এড়িয়ে চলেছে যে এটি বজায় রাখা প্রায় অসম্ভব হয়ে ওঠে (এমনকি সহকারীদের জন্যও)।

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

এই বলে যে, আমি এই বিষয়ে খুব কমই উদ্যোগী। কিছু সমস্যা যখন অপরিবর্তনীয় তখন কিছু ঠিকঠাক মডেল করে না। তবে আমি মনে করি যে আপনার কোডটি যতটা সম্ভব আপনার দিকে চাপ দেওয়ার চেষ্টা করা উচিত, অবশ্যই ধরে নেওয়া উচিত যে আপনি কোনও ভাষা ব্যবহার করছেন যা এটি একটি টেকনেবল মতামত তৈরি করে (সি / সি ++ এটি জাভা হিসাবে খুব জটিল করে তোলে) । সংক্ষেপে: সুবিধাগুলি আপনার সমস্যার উপর কিছুটা নির্ভর করে তবে আমি অপরিবর্তনীয়তা পছন্দ করতে চাই।


11
দুর্দান্ত সাড়া। তবে একটি ছোট্ট প্রশ্ন: সি ++ এর অযোগ্যতার পক্ষে ভাল সমর্থন নেই? নন const-শুদ্ধি বৈশিষ্ট্য যথেষ্ট?
দিমিত্রি সি

1
@ ডিমিট্রিক: সি ++ এর আসলে আরও কিছু মৌলিক বৈশিষ্ট্য রয়েছে, বিশেষত স্টোরেজ অবস্থানগুলির মধ্যে একটি ভাল পার্থক্য যা অবজেক্টের পরিচয়কে আবদ্ধ করে এমন অংশীদারিত্বহীন রাষ্ট্রকে মীমাংসিত করে বলে মনে করা হয়।
ক্যাট

2
জাভা প্রোগ্রামিংয়ের ক্ষেত্রে জোশুয়া ব্লচ তাঁর বিখ্যাত বই কার্যকর জাভা (আইটেম 15)
বিষয়টি

27

অপ্রচলিত বস্তু বনাম অপরিবর্তনীয় সংগ্রহ

পরিবর্তনীয় বনাম অপরিবর্তনীয় বস্তু নিয়ে বিতর্কের অন্যতম সূক্ষ্ম বিষয় হ'ল সংগ্রহের ক্ষেত্রে অপরিবর্তনীয় ধারণার প্রসারণের সম্ভাবনা। অপরিবর্তনীয় বস্তু এমন একটি বস্তু যা প্রায়শই ডেটার একক লজিকাল কাঠামোকে উপস্থাপন করে (উদাহরণস্বরূপ একটি অপরিবর্তনীয় স্ট্রিং)। যখন আপনার কোনও পরিবর্তনযোগ্য অবজেক্টের রেফারেন্স থাকবে তখন অবজেক্টের সামগ্রী পরিবর্তন হবে না।

অপরিবর্তনীয় সংগ্রহ এমন একটি সংগ্রহ যা কখনও বদলায় না।

আমি যখন কোনও পরিবর্তনীয় সংগ্রহের উপর কোনও ক্রিয়াকলাপ করি, তারপরে আমি সংগ্রহটি স্থানে পরিবর্তন করি এবং সংগ্রহে উল্লেখ করা সমস্ত সত্তা পরিবর্তনটি দেখতে পাবে।

আমি যখন অপরিবর্তনীয় সংগ্রহের উপর একটি ক্রিয়াকলাপ করি তখন পরিবর্তনের প্রতিফলন করে একটি নতুন সংগ্রহকে একটি রেফারেন্স ফিরিয়ে দেওয়া হয়। সংগ্রহের পূর্ববর্তী সংস্করণগুলির উল্লেখ রয়েছে এমন সমস্ত সত্ত্বা পরিবর্তনটি দেখতে পাবে না।

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

অপরিবর্তনীয় বনাম পরিবর্তনীয় পরিবর্তনশীল / রেফারেন্স

কিছু কার্যকরী ভাষা কেবল রেফারেন্সের জন্য একটি একক রেফারেন্সের অনুমতি দেয় বলে রেফারেন্সগুলিকে নিজেরাই আপত্তি জানাতে অপরিবর্তনীয়তার ধারণাটি গ্রহণ করে।

  • এরলং এ এটি সমস্ত "ভেরিয়েবল" এর ক্ষেত্রে সত্য। আমি একবারে কেবলমাত্র একটি রেফারেন্সে অবজেক্টগুলি বরাদ্দ করতে পারি। আমি যদি কোনও সংগ্রহ পরিচালনা করে থাকি তবে আমি পুরানো রেফারেন্সে (পরিবর্তনশীল নাম) নতুন সংগ্রহটি পুনরায় সাইন করতে সক্ষম হব না।
  • স্কালা এটিকে ভাষাতে ভের বা ভ্যাল দিয়ে ঘোষিত সমস্ত রেফারেন্স সহ ভাষাতেও তৈরি করে , ভ্যালস কেবলমাত্র একক কার্যনির্বাহী এবং কার্যকরী শৈলীর প্রচার করে, তবে ভারগুলি আরও সি-জাতীয় বা জাভা-জাতীয় প্রোগ্রাম কাঠামোর অনুমতি দেয়।
  • ভেরি / ভ্যালার ডিক্লেয়ারেশন প্রয়োজনীয়, যখন প্রচলিত অনেক ভাষা avaচ্ছিক সংশোধক যেমন জাভাতে চূড়ান্ত এবং সি-এ কনস্টের ব্যবহার করে use

ইজ অফ ডেভলপমেন্ট বনাম পারফরম্যান্স

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

প্রধান অসুবিধা হল পারফরম্যান্স। খেলনা সমস্যাটিতে কিছু অপরিবর্তনীয় বনাম পরিবর্তনযোগ্য বস্তুর তুলনা করে জাভাতে করা একটি সাধারণ পরীক্ষার উপর এখানে একটি লেখার রচনা রয়েছে ।

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


12

এই ব্লগ পোস্টটি দেখুন: http://www.yegor256.com/2014/06/09/objects-should-be- অবিচ্ছেদ্য html । এটি ব্যাখ্যা করে যে অপরিবর্তনীয় জিনিসগুলি পরিবর্তনের চেয়ে কেন ভাল than সংক্ষেপে:

  • অপরিবর্তনীয় বস্তুগুলি নির্মাণ, পরীক্ষা এবং ব্যবহার করা সহজ
  • সত্যিকারের অপরিবর্তনীয় বস্তু সর্বদা থ্রেড-নিরাপদ
  • তারা সাময়িক মিলন এড়াতে সহায়তা করে
  • তাদের ব্যবহার পার্শ্ব-প্রতিক্রিয়া মুক্ত (কোনও প্রতিরক্ষামূলক অনুলিপি নেই)
  • পরিচয় পরিবর্তনের সমস্যা এড়ানো হয়
  • তাদের সর্বদা ব্যর্থতা পরমাণু থাকে
  • তারা ক্যাশে অনেক সহজ

10

অপরিবর্তনীয় বস্তু একটি খুব শক্তিশালী ধারণা। সমস্ত ক্লায়েন্টের জন্য অবজেক্ট / ভেরিয়েবল ধারাবাহিক রাখার চেষ্টা করার বোঝা তারা অনেকটা কেড়ে নেয়।

আপনি সেগুলি নিম্ন স্তরের, বহু-বহুবিজ্ঞানযুক্ত অবজেক্টের জন্য ব্যবহার করতে পারেন - সিপিয়েন্ট শ্রেণির মতো - যা বেশিরভাগ মান শব্দার্থক ব্যবহৃত হয়।

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

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

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

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


আমি মনে করি আমি সর্বাধিক সুবিধার জন্য বিভাগ 4 টি ভুল বুঝেছি: অপরিবর্তনীয়তা + অবজেক্ট শব্দার্থবিজ্ঞান + স্মার্ট পয়েন্টারগুলি বস্তুর মালিকানাটিকে "মোট" পয়েন্ট সরবরাহ করে। তাহলে এটা বিতর্কযোগ্য? আমি মনে করি আপনি "মোট" ভুলভাবে ব্যবহার করছেন ... পরের বাক্য হিসাবে দেখানো হচ্ছে বস্তুটি তার "মোট" (বিতর্কযোগ্য) আচরণ থেকে "নির্বিচারবাদী আচরণ" বোঝিয়েছে।
বেঞ্জামিন

আপনি ঠিক বলেছেন, আমি ভুলভাবে 'মোট' ব্যবহার করেছি। এটি পরিবর্তন হয়েছে বিবেচনা করুন :)
কিউবিজিজেড

6

আপনি কোন ভাষায় কথা বলছেন তা নির্দিষ্ট করা উচিত। সি বা সি ++ এর মতো নিম্ন-স্তরের ভাষার জন্য, আমি স্থান সংরক্ষণ এবং মেমরির মন্থকে হ্রাস করতে পার্শ্ববর্তী পরিবর্তনগুলি ব্যবহার করতে পছন্দ করি। উচ্চ-স্তরের ভাষায়, অপরিবর্তনীয় বস্তু কোডের আচরণের বিষয়ে যুক্তিযুক্ত হওয়া সহজ করে তোলে (বিশেষত বহু-থ্রেডযুক্ত কোড) কারণ কোনও "দূরত্বে ভুতুড়ে কর্ম" নেই।


আপনি পরামর্শ দিচ্ছেন যে থ্রেডগুলি পরিমাণ মতো জড়িয়ে আছে? এটি বেশ প্রসারিত :) থ্রেডগুলি আসলে, যদি আপনি এটির বিষয়ে চিন্তা করেন তবে জড়িয়ে যাওয়ার খুব কাছাকাছি। একটি থ্রেড অন্য পরিবর্তনকে প্রভাবিত করে। +1
ndrewxie

4

একটি পরিবর্তনীয় অবজেক্টটি কেবল এমন একটি বস্তু যা এটি তৈরি / তাত্ক্ষণিকভাবে তৈরি করার পরে সংশোধন করা যেতে পারে, বনাম একটি অপরিবর্তনীয় বস্তু যা পরিবর্তন করা যায় না ( বিষয়টির উইকিপিডিয়া পৃষ্ঠাটি দেখুন )। প্রোগ্রামিং ভাষায় এর উদাহরণ পাইথনস তালিকা এবং টিপলস t তালিকাগুলি পরিবর্তন করা যেতে পারে (যেমন, নতুন আইটেমগুলি এটি তৈরির পরে যুক্ত করা যেতে পারে) যেখানে টিপলস পারে না।

আমি সত্যিই মনে করি না যে একটি ক্লিয়ারকটের উত্তর আছে যা সমস্ত পরিস্থিতিতে সবচেয়ে ভাল। তাদের দুজনেরই জায়গা আছে।


1

যদি কোনও শ্রেণির ধরণের পরিবর্তনযোগ্য হয় তবে সেই শ্রেণীর ধরণের একটি পরিবর্তকের বিভিন্ন অর্থ হতে পারে। উদাহরণস্বরূপ, ধরুন যে কোনও বস্তুর fooএকটি ক্ষেত্র রয়েছে int[] arr, এবং এটিতে int[3]{5, 7, 9 numbers সংখ্যাটি ধারণ করে to যদিও ক্ষেত্রের ধরণটি জানা যায়, কমপক্ষে চারটি আলাদা জিনিস এটি প্রতিনিধিত্ব করতে পারে:

  • একটি সম্ভাব্য অংশীদার করা রেফারেন্স, সব যার হোল্ডার পরোয়া শুধুমাত্র এটি মান encapsulates 5, 7, এবং 9. যদি fooচায় arrমান আলাদা encapsulate করতে, এটা একটি ভিন্ন অ্যারের পছন্দসই মান থাকা প্রতিস্থাপন করতে হবে। যদি কেউ একটি অনুলিপি তৈরি করতে চান foo, তবে অনুলিপিটি arrযে কোনওটি সুবিধাজনক, কোনওটি অনুলিপিটিকে একটি রেফারেন্স বা একটি নতুন অ্যারে দিতে পারে {1,2,3 values ​​মানগুলিতে।

  • মহাবিশ্বের যে কোনও জায়গায় কেবলমাত্র একটি অ্যারে যা 5, 7 এবং 9 মানগুলিকে আবদ্ধ করে যা এই মুহুর্তে 5, 7 এবং 9 মানগুলিকে ধারণ করে; যদি fooএটি 5, 8, এবং 9 এর মানগুলি সজ্জিত করতে চায় তবে তা হয় সেই অ্যারেতে দ্বিতীয় আইটেমটি পরিবর্তন করতে পারে বা 5, 8, এবং 9 মানগুলিকে ধারণ করে একটি নতুন অ্যারে তৈরি করতে পারে এবং পুরানোটিকে ত্যাগ করতে পারে। নোট করুন যে কেউ যদি একটি অনুলিপি তৈরি করতে চেয়েছিলেন তবে মহাবিশ্বের যে কোনও জায়গায় এই অ্যারেটির একমাত্র রেফারেন্স হিসাবে থাকতে fooহলে অনুলিপিটিতে arrএকটি নতুন অ্যারের রেফারেন্স সহ প্রতিস্থাপন করতে হবে foo.arr

  • একটি অ্যারে সম্পর্কিত একটি রেফারেন্স যা অন্য কোনও অবজেক্টের মালিকানাধীন যা এটি fooকোনও কারণে প্রকাশ করেছে (যেমন সম্ভবত এটি fooসেখানে কিছু ডেটা সঞ্চয় করতে চায় )। এই arrদৃশ্যে অ্যারের সামগ্রীগুলি আবশ্যক নয়, বরং এটির পরিচয় । যেহেতু arrনতুন অ্যারের রেফারেন্সের সাথে প্রতিস্থাপন করা এর অর্থ পুরোপুরি বদলে যাবে, একটি অনুলিপি fooএকই অ্যারেতে একটি রেফারেন্স রাখা উচিত।

  • এর মধ্যে একটি অ্যারের রেফারেন্স যার fooমধ্যে একমাত্র মালিক, তবে কোন উল্লেখের কারণে রেফারেন্সগুলি অন্য কোনও অবজেক্টের দ্বারা কোনও কারণে ধরে রাখা হয় (যেমন এটি সেখানে অন্য তথ্য রাখতে চাইলে - পূর্ববর্তী কেসটির ফ্লিপসাইড)। এই arrদৃশ্যে অ্যারের সনাক্তকরণ এবং এর বিষয়বস্তু উভয়ই সজ্জিত করে। প্রতিস্থাপন করা হচ্ছে arrএকটি নতুন অ্যারে একটি রেফারেন্স সঙ্গে সম্পূর্ণভাবে এর অর্থ পরিবর্তন হবে, কিন্তু একটি ক্লোন এর থাকার arrপড়ুন foo.arrভাবনাটি হলো এই যে লঙ্ঘন করবে fooএকমাত্র মালিক। অনুলিপি করার উপায় নেই foo

তত্ত্ব অনুসারে, int[]একটি দুর্দান্ত সাধারণ সু-সংজ্ঞায়িত প্রকার হওয়া উচিত, তবে এর চারটি আলাদা অর্থ রয়েছে। বিপরীতে, একটি অপরিবর্তনীয় বস্তুর (উদাহরণস্বরূপ String) একটি রেফারেন্সের কেবলমাত্র একটি অর্থ থাকে। অপরিবর্তনীয় বস্তুর বেশিরভাগ "শক্তি" সেই সত্য থেকেই আসে।


1

পরিবর্তনীয় দৃষ্টান্তগুলি রেফারেন্স দ্বারা পাস করা হয়।

অপরিবর্তনীয় দৃষ্টান্তগুলি মান দিয়ে যায়।

বিমূর্ত উদাহরণ। মনে করুন যে আমার এইচডিডি তে txtfile নামের একটি ফাইল বিদ্যমান । এখন, যখন আপনি আমার কাছ থেকে টেক্সটফাইল জিজ্ঞাসা করবেন, আমি এটিকে দুটি মোডে ফিরিয়ে দিতে পারি:

  1. টেক্সটফাইলে শর্টকাট তৈরি করুন এবং আপনার কাছে পাস শর্টকাট, বা
  2. টেক্সটফাইলের জন্য একটি অনুলিপি এবং আপনার কাছে পাস কপি নিন ।

প্রথম মোডে, রিটার্ন করা টেক্সটফাইলটি একটি পরিবর্তনীয় ফাইল, কারণ আপনি যখন শর্টকাট ফাইলটিতে পরিবর্তন করেন, আপনি মূল ফাইলটিতেও পরিবর্তন করেন। এই মোডের সুবিধা হ'ল প্রতিটি প্রত্যাবর্তিত শর্টকাটের কম মেমোরি প্রয়োজন (র‌্যামে বা এইচডিডি তে) এবং অসুবিধাটি হ'ল প্রত্যেকেরই (কেবল আমি নয়, মালিকই নয়) ফাইল সামগ্রী পরিবর্তন করার অনুমতি রয়েছে।

দ্বিতীয় মোডে, রিটার্ন করা টেক্সটফাইল একটি অপরিবর্তনীয় ফাইল, কারণ প্রাপ্ত ফাইলের সমস্ত পরিবর্তনগুলি মূল ফাইলটিকে বোঝায় না। এই মোডের সুবিধা হ'ল কেবলমাত্র আমি (মালিক) মূল ফাইলটি পরিবর্তন করতে পারি এবং অসুবিধা হ'ল প্রতিটি প্রত্যাবর্তিত অনুলিপি মেমরির প্রয়োজনীয় (র‌্যামে বা এইচডিডি তে))


এটি কঠোরভাবে সত্য নয়। অপরিবর্তনীয় দৃষ্টান্তগুলি প্রকৃতপক্ষে রেফারেন্স দ্বারা পাস করা যেতে পারে, এবং প্রায়শই হয়। অনুলিপিটি প্রধানত তখন করা হয় যখন আপনাকে অবজেক্ট বা ডেটা কাঠামো আপডেট করতে হবে।
জ্যামন হলমগ্রেন

0

আপনি যদি একটি অ্যারে বা স্ট্রিংয়ের উল্লেখগুলি ফেরৎ করেন তবে বাইরের পৃথিবী সেই বস্তুর সামগ্রীটি পরিবর্তন করতে পারে এবং তাই এটিকে পরিবর্তনযোগ্য (পরিবর্তনযোগ্য) অবজেক্ট হিসাবে তৈরি করতে পারে।


0

অপরিবর্তনীয় উপায়গুলি পরিবর্তন করা যায় না, এবং পরিবর্তনের অর্থ আপনি পরিবর্তন করতে পারেন।

জাভা আদিম থেকে পৃথক। প্রিমিটিভগুলি বিভিন্ন ধরণের (বুলেটিয়ান, ইনট, ইত্যাদি) তৈরি করা হয় এবং অবজেক্টস (ক্লাস) ব্যবহারকারী তৈরি প্রকার।

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

প্রচুর লোকেরা মনে করে যে তাদের মধ্যে একটি চূড়ান্ত সংশোধক আগমনকারী আদিম এবং অবজেক্ট ভেরিয়েবলগুলি অপরিবর্তনীয়, তবে এটি ঠিক সত্য নয়। চূড়ান্ত প্রায় পরিবর্তনশীল জন্য অপরিবর্তনীয় মানে না। এখানে
http://www.siteconsortium.com/h/D0000F.php উদাহরণ দেখুন ।


0

Immutable object- এমন একটি অবজেক্টের অবস্থা যা তৈরির পরে পরিবর্তন করা যায় না। যখন এর সমস্ত ক্ষেত্র অপরিবর্তনীয় তখন অবজেক্টটি পরিবর্তনযোগ্য

থ্রেড নিরাপদ

অপরিবর্তনীয় বস্তুর প্রধান সুবিধা হ'ল এটি প্রাকৃতিকভাবে সহবর্তী পরিবেশের জন্য। সম্মতিতে সবচেয়ে বড় সমস্যাটি হ'ল shared resourceযে কোনও থ্রেড পরিবর্তন করা যায়। তবে কোনও বস্তু যদি পরিবর্তনযোগ্য না হয় তবে read-onlyএটিই থ্রেড নিরাপদ অপারেশন। একটি আসল অপরিবর্তনীয় বস্তুর যেকোন সংশোধন একটি অনুলিপি ফেরত দেয়

পার্শ্ব প্রতিক্রিয়া বিনামূল্যে

একজন বিকাশকারী হিসাবে আপনি সম্পূর্ণরূপে নিশ্চিত যে অপরিবর্তনীয় বস্তুর রাজ্য কোনও স্থান থেকে পরিবর্তন করা যাবে না (উদ্দেশ্য অনুযায়ী বা না)

সংকলন অপ্টিমাইজেশন

পারফরম্যান্সের উন্নতি

অসুবিধা:

কোনও পরিবর্তনীয় বস্তুর পরিবর্তনের চেয়ে অবজেক্টের অনুলিপি করা আরও ভারী ক্রিয়াকলাপ, এজন্য এর কিছু কার্য সম্পাদনযোগ্য পদচিহ্ন রয়েছে

একটি immutableঅবজেক্ট তৈরি করতে আপনার ব্যবহার করা উচিত:

  1. ভাষা স্তর। প্রতিটি ভাষাতে এটিতে আপনাকে সহায়তা করার জন্য সরঞ্জাম রয়েছে। উদাহরণস্বরূপ জাভা আছে finalএবং primitives, সুইফট রয়েছে letএবং struct[সম্পর্কে] । ভাষা একধরণের ভেরিয়েবল সংজ্ঞায়িত করে। উদাহরণস্বরূপ জাভা আছে primitiveএবং referenceটাইপ করুন, সুইফট আছে valueএবং referenceটাইপ [সম্পর্কে] । অপরিবর্তনীয় বস্তুর জন্য আরও সুবিধাজনক primitivesএবং valueটাইপ করুন যা ডিফল্টরূপে একটি অনুলিপি তৈরি করে। referenceটাইপ হিসাবে এটি আরও কঠিন (কারণ আপনি এটির বাইরে অবজেক্টের অবস্থা পরিবর্তন করতে সক্ষম) তবে সম্ভব। উদাহরণস্বরূপ আপনি cloneবিকাশকারী পর্যায়ে প্যাটার্ন ব্যবহার করতে পারেন

  2. বিকাশকারী স্তর। বিকাশকারী হিসাবে আপনার রাষ্ট্র পরিবর্তন করার জন্য একটি ইন্টারফেস সরবরাহ করা উচিত নয়

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