অভ্যন্তরীণ ক্লাসগুলি ব্যবহার করার জন্য এটি ফাঁস কখন নিরাপদ হয়?


324

আমি অ্যান্ড্রয়েড মেমরি তথ্য ফাঁসের কিছু নিবন্ধ পড়া এবং Google ইনপুট / আউটপুট থেকে এই আকর্ষণীয় ভিডিও দেখেছেন হয়েছে বিষয়ের উপর

তবুও, আমি ধারণাটি পুরোপুরি বুঝতে পারি না এবং বিশেষত যখন এটি কোনও ক্রিয়াকলাপের অভ্যন্তর শ্রেণীর ব্যবহারকারীর পক্ষে নিরাপদ বা বিপজ্জনক হয় ।

এটি আমি বুঝতে পেরেছি:

যদি কোনও অভ্যন্তর শ্রেণীর উদাহরণ তার বাহ্যিক শ্রেণির (একটি ক্রিয়াকলাপ) এর চেয়ে বেশি সময় বেঁচে থাকে তবে একটি মেমরি ফুটো ঘটে। -> কোন পরিস্থিতিতে এটি ঘটতে পারে?

এই উদাহরণে, আমি অনুমান করি যে ফাঁসের কোনও ঝুঁকি নেই, কারণ বেনাম শ্রেণীর বর্ধনের কোনও উপায় OnClickListenerনেই যে ক্রিয়াকলাপের চেয়ে বেশি দিন বাঁচবে, তাই না?

    final Dialog dialog = new Dialog(this);
    dialog.setContentView(R.layout.dialog_generic);
    Button okButton = (Button) dialog.findViewById(R.id.dialog_button_ok);
    TextView titleTv = (TextView) dialog.findViewById(R.id.dialog_generic_title);

    // *** Handle button click
    okButton.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            dialog.dismiss();
        }
    });

    titleTv.setText("dialog title");
    dialog.show();

এখন, এই উদাহরণটি বিপজ্জনক, এবং কেন?

// We are still inside an Activity
_handlerToDelayDroidMove = new Handler();
_handlerToDelayDroidMove.postDelayed(_droidPlayRunnable, 10000);

private Runnable _droidPlayRunnable = new Runnable() { 
    public void run() {
        _someFieldOfTheActivity.performLongCalculation();
    }
};

আমার এই সন্দেহের সাথে সন্দেহ আছে যে কোনও কার্যকলাপ ধ্বংস হয়ে গেলে এবং পুনরায় তৈরি হওয়ার সময় কী রাখা হয় তা বিশদভাবে বোঝার সাথে এই বিষয়টি বোঝার দরকার।

তাই কি?

ধরা যাক আমি সবেমাত্র ডিভাইসটির ওরিয়েন্টেশন পরিবর্তন করেছি (যা ফাঁসের সর্বাধিক সাধারণ কারণ)। কখন super.onCreate(savedInstanceState)আমাকে ডাকা onCreate()হবে, এটি কি ক্ষেত্রগুলির মানগুলিকে পুনরুদ্ধার করবে (ওরিয়েন্টেশন পরিবর্তনের আগে যেমন ছিল)? এটি কি অভ্যন্তরীণ শ্রেণির রাজ্যগুলি পুনরুদ্ধার করবে?

আমি বুঝতে পারি যে আমার প্রশ্নটি খুব সুনির্দিষ্ট নয়, তবে আমি এমন কোনও ব্যাখ্যাকে প্রশংসা করব যা বিষয়গুলিকে আরও পরিষ্কার করে দিতে পারে।


14
এই ব্লগ পোস্ট এবং এই ব্লগ পোস্টে মেমরি ফাঁস এবং অভ্যন্তরীণ ক্লাস সম্পর্কে কিছু ভাল তথ্য রয়েছে। :)
অ্যালেক্স লকউড

উত্তর:


651

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

নেস্টেড ক্লাস: পরিচিতি

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

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

আবর্জনা সংগ্রহ এবং অভ্যন্তরীণ ক্লাস

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

এখানে আসল সমস্যাটি হ'ল যখন কোনও অভ্যন্তর শ্রেণি তার ধারকের চেয়ে দীর্ঘতর রাখে। এটি ধারণক্ষম শ্রেণীর অন্তর্নিহিত রেফারেন্সের কারণে এটি। এটির একমাত্র উপায় হ'ল যদি ধারণক্ষম শ্রেণীর বাইরের কোনও অবজেক্টটি অন্তর্ভুক্ত অবজেক্টটিকে বিবেচনা না করে অভ্যন্তরীণ বস্তুর রেফারেন্স রাখে।

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

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

সমাধান: ইনার ক্লাস

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

ক্রিয়াকলাপ এবং দর্শন: ভূমিকা

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

একটি ভিউ তৈরি করার জন্য, এটি কোথায় তৈরি করতে হবে এবং এটির কোনও শিশু রয়েছে যাতে এটি প্রদর্শন করতে পারে তা অবশ্যই তা জানতে হবে। এর অর্থ হ'ল প্রতিটি ভিউয়ের ক্রিয়াকলাপের মাধ্যমে (মাধ্যমে getContext()) একটি উল্লেখ রয়েছে । তদুপরি, প্রতিটি ভিউ তার বাচ্চাদের (যেমন getChildAt()) উল্লেখ করে । অবশেষে, প্রতিটি ভিউ রেন্ডার বিটম্যাপের একটি রেফারেন্স রাখে যা এর প্রদর্শনকে উপস্থাপন করে।

যখনই আপনার কোনও ক্রিয়াকলাপের (বা ক্রিয়াকলাপের প্রসঙ্গে) কোনও রেফারেন্স পাওয়া যায়, এর অর্থ হ'ল আপনি বিন্যাস স্তরক্রমের নীচে ENTRE চেইনটি অনুসরণ করতে পারেন। এই কারণেই ক্রিয়াকলাপ বা ভিউ সম্পর্কিত মেমরি ফাঁস এত বিশাল চুক্তি। এটি একবারে সমস্ত ফাঁস হওয়া মনের এক টন হতে পারে ।

ক্রিয়াকলাপ, দর্শন এবং অভ্যন্তরীণ ক্লাস

অভ্যন্তরীণ ক্লাসগুলি সম্পর্কে উপরের তথ্য প্রদত্ত, এগুলি সর্বাধিক সাধারণ মেমরি ফাঁস হয় তবে সাধারণভাবে এড়ানো হয়। যদিও কোনও অভ্যন্তরীণ শ্রেণীর ক্রিয়াকলাপ শ্রেণীর সদস্যদের সরাসরি অ্যাক্সেস থাকা বাঞ্ছনীয় তবে অনেকে সম্ভাব্য সমস্যাগুলি এড়াতে কেবল এগুলি স্থির করতে ইচ্ছুক। ক্রিয়াকলাপ এবং দর্শনগুলির সমস্যা এর চেয়ে অনেক গভীর।

ফাঁস হওয়া ক্রিয়াকলাপ, দর্শন এবং ক্রিয়াকলাপ প্রসঙ্গে

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

সমাধান: ক্রিয়াকলাপ এবং দর্শন

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

রানবনেবল: ভূমিকা

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

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

রানবেল এবং ক্রিয়াকলাপ / দর্শন

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

সমাধান: রান্নেবল

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

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

নীচে একটি বেসিক কারখানার একটি সাধারণ উদাহরণ রয়েছে (কোডটি অনুপস্থিত)।

public class LeakFactory
{//Just so that we have some data to leak
    int myID = 0;
// Necessary because our Leak class is an Inner class
    public Leak createLeak()
    {
        return new Leak();
    }

// Mass Manufactured Leak class
    public class Leak
    {//Again for a little data.
       int size = 1;
    }
}

এটি একটি সাধারণ উদাহরণ নয়, তবে এটি যথেষ্ট সাধারণ। এখানে কীটি কনস্ট্রাক্টর ...

public class SwissCheese
{//Can't have swiss cheese without some holes
    public Leak[] myHoles;

    public SwissCheese()
    {//Gotta have a Factory to make my holes
        LeakFactory _holeDriller = new LeakFactory()
    // Now, let's get the holes and store them.
        myHoles = new Leak[1000];

        for (int i = 0; i++; i<1000)
        {//Store them in the class member
            myHoles[i] = _holeDriller.createLeak();
        }

    // Yay! We're done! 

    // Buh-bye LeakFactory. I don't need you anymore...
    }
}

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

কল্পনা করুন যখন আমরা কন্সট্রাক্টরটি কিছুটা পরিবর্তন করি।

public class SwissCheese
{//Can't have swiss cheese without some holes
    public Leak[] myHoles;

    public SwissCheese()
    {//Now, let's get the holes and store them.
        myHoles = new Leak[1000];

        for (int i = 0; i++; i<1000)
        {//WOW! I don't even have to create a Factory... 
        // This is SOOOO much prettier....
            myHoles[i] = new LeakFactory().createLeak();
        }
    }
}

এখন, এই নতুন লিকফ্যাক্টরিগুলির প্রত্যেকটির সবেমাত্র ফাঁস হয়েছে। আপনি যে কি মনে করেন? এটি একটি অভ্যন্তর শ্রেণি যে কোনও ধরণের বহিরাগত শ্রেণিকে কীভাবে বহন করতে পারে তার দুটি খুব সাধারণ উদাহরণ। যদি সেই বাইরের শ্রেণিটি যদি কোনও ক্রিয়াকলাপ হত, তবে এটি কতটা খারাপ হত তা কল্পনা করুন।

উপসংহার

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


3
এই পরিষ্কার এবং বিস্তারিত উত্তরের জন্য অনেক ধন্যবাদ। আমি শুধু আপনাকে দ্বারা "অনেক ডেভেলপার বন্ধ কাজে লাগাতে তাদের Runnables সংজ্ঞায়িত করতে" বলতে চাচ্ছি তা পাবেন না
সেবাস্টিয়ান

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

26
আলোকিত করে লেখা! পরিভাষা সম্পর্কিত একটি মন্তব্য: জাভাতে স্থির অভ্যন্তর শ্রেণির মতো কোনও জিনিস নেই । ( ডক্স ) নেস্টেড শ্রেণি হয় হয় স্থির বা অভ্যন্তরীণ , তবে একই সাথে উভয়ই হতে পারে না।
jenzz

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

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