জাভা স্থিতিতে বেনামে অভ্যন্তরীণ ক্লাস করা কি সম্ভব?


123

জাভাতে, নেস্টেড ক্লাসগুলি হয় staticবা নাও হতে পারে । যদি তা হয় তবে তাদের staticধারণকৃত উদাহরণের পয়েন্টারের কোনও উল্লেখ নেই (তাদের আর অভ্যন্তরীণ শ্রেণিও বলা হয় না, তাদের নেস্টেড ক্লাস বলা হয়)।

staticযখন রেফারেন্সের প্রয়োজন হয় না তখন কোনও নেস্টেড ক্লাস তৈরি করতে ভুলে যাওয়া আবর্জনা সংগ্রহ বা এড়াতে বিশ্লেষণে সমস্যা দেখা দিতে পারে।

বেনামে অন্তর্নিহিত শ্রেণিটি তৈরি করাও কি সম্ভব static? অথবা সংকলকটি স্বয়ংক্রিয়ভাবে এটি খুঁজে বের করে (যা এটি পারে, কারণ কোনও সাবক্ল্যাস থাকতে পারে না)?

উদাহরণস্বরূপ, আমি যদি কোনও বেনামে তুলনা করি তবে আমার বাইরের রেফারেন্সের প্রয়োজন হয় না:

  Collections.sort(list, new Comparator<String>(){
       int compare(String a, String b){
          return a.toUpperCase().compareTo(b.toUpperCase());
       }
  }

কোনও অভ্যন্তরীণ শ্রেণীর স্থির করতে ভুলে গিয়ে "আবর্জনা সংগ্রহ বা পালানো বিশ্লেষণ" নিয়ে কী কী সমস্যা রয়েছে? আমি ভেবেছিলাম এটি কেবল পারফরম্যান্স সম্পর্কে ...
টিম বাথ

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

আমি জানি, এটি কেবল একটি উদাহরণ, তবে যেহেতু এটি পুনরাবৃত্তিযোগ্য, তাই এটি উল্লেখ করা উচিত যে Collections.sort(list, String.CASE_INSENSITIVE_ORDER)জাভা 2 সাল থেকে কাজ করে, পড়ুন, যেহেতু সংগ্রহের API উপস্থিত রয়েছে ...
হোলগার

উত্তর:


138

না, আপনি পারবেন না এবং না, সংকলকটি এটি বের করতে পারে না। এই কারণেই ফাইন্ডব্যাগগুলি বেনামে অভ্যন্তরীণ ক্লাসগুলিকে নামযুক্ত staticনেস্টেড ক্লাসে পরিবর্তনের পরামর্শ দেয় যদি তারা তাদের অন্তর্নিহিত thisরেফারেন্স ব্যবহার না করে ।

সম্পাদনা: টম হাটিন - ট্যাকলাইন বলছে যে বেনাম শ্রেণিটি একটি স্থিতিশীল প্রসঙ্গে (যেমন mainপদ্ধতিতে) তৈরি করা হয়, তবে বেনাম শ্রেণিটি আসলেই static। তবে জেএলএস একমত নয় :

abstractবেনাম শ্রেণি কখনই হয় না (§8.1.1.1)। বেনামে বর্গ সর্বদা একটি অভ্যন্তর শ্রেণি (§8.1.3); এটি কখনই নয় static(§8.1.1, §8.5.1)। একটি finalবেনাম শ্রেণি সর্বদা অন্তর্নিহিত (.18.1.1.2)।

রোডি গ্রিনের জাভা গ্লোসারি বলেছেন যে বেনাম ক্লাসগুলি স্থির প্রসঙ্গে মঞ্জুরিপ্রাপ্ত তা বাস্তবায়ন নির্ভর dependent

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

সম্পাদনা 2: জেএলএস প্রকৃতপক্ষে স্থির প্রসঙ্গটি আরও স্পষ্টভাবে covers15.9.2কভার করে :

যাক সি বর্গ instantiated হচ্ছে হবে | আমি উদাহরণ হিসেবে বলা যায় তৈরি করা হচ্ছে হও। যদি সি ইনার ক্লাস হয় তারপর আমি একটি অবিলম্বে পরিক্ষেপ উদাহরণস্বরূপ থাকতে পারে। তত্ক্ষণাত্ i (§8.1.3) এর সংলগ্ন উদাহরণটি নিম্নলিখিত হিসাবে নির্ধারিত হয়।

  • যদি সি একটি বেনামী বর্গ, তারপর হল:
    • যদি শ্রেণীর উদাহরণ তৈরির এক্সপ্রেশনটি কোনও স্থির প্রসঙ্গে (§8.1.3) হয়, তবে আমার সাথে সাথেই কোনও ঘেরের উদাহরণ নেই।
    • অন্যথায়, এর অবিলম্বে পরিক্ষেপ উদাহরণস্বরূপ আমি হয় this

সুতরাং স্থিতিশীল প্রসঙ্গে একটি staticবেনাম শ্রেণি মোটামুটি নেস্টেড বর্গের সমতুল্য যে এটি প্রযুক্তিগতভাবে কোনও staticবর্গ না হলেও সন্নিবেশকারী শ্রেণীর কোনও রেফারেন্স রাখে না ।


19
ফাইন্ডব্যাগগুলির জন্য +1 - প্রতিটি জাভা বিকাশকারীকে তাদের বিল্ডে এটি থাকা উচিত।
অ্যান্ড্রু ডফি

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

2
জেএলএস 3 য় এড স্থিতিক প্রসঙ্গে অভ্যন্তর শ্রেণির ক্ষেত্রে কাজ করে। এগুলি জেএলএস অর্থে স্থির নয়, তবে প্রশ্নটিতে দেওয়া অর্থে এটি স্থির are
টম হাটিন - 14

6
এটি বাস্তবায়নের উপর নির্ভর করে কীভাবে তার উদাহরণ এখানে দেওয়া হয়েছে: জাভাক (সূর্য-জেডিকি-১..0.০.০) ব্যবহার করে এবং এক্সিলিপ সংকলক ব্যবহার করে এই কোডটি মুদ্রণ trueকরে false
পল বেলোড়া

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

15

ধরনের। স্থির পদ্ধতিতে তৈরি একটি বেনামি অভ্যন্তর শ্রেণি স্পষ্টতই কার্যকরভাবে স্থির হবে কারণ এটির বাইরের কোনও উত্স নেই।

স্থির প্রসঙ্গ এবং স্থির নেস্টেড ক্লাসগুলিতে অভ্যন্তরীণ শ্রেণীর মধ্যে কিছু প্রযুক্তিগত পার্থক্য রয়েছে। আপনি যদি আগ্রহী হন তবে জেএলএস 3 য় এডটি পড়ুন।


আসলে, আমি এটি ফিরিয়ে নিই; জেএলএস একমত নয়। java.sun.com/docs/books/jls/third%5Fedition/html/… : "বেনামে বর্গ সর্বদা একটি অভ্যন্তর শ্রেণি; এটি কখনও স্থির হয় না।"
মাইকেল ম্যাইইয়ার্স

1
স্থিতিশীল একটি পৃথক অর্থে প্রশ্নে।
টম হাটিন - 14

1
আমি; একটু স্পষ্টতা যোগ করেছি।
টম হাটিন - 14

15

আমি মনে করি এখানে নামকরণে কিছুটা বিভ্রান্তি রয়েছে যা স্বীকারোক্তিজনকভাবে খুব মূর্খ এবং বিভ্রান্তিকর।

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

public class MyClass {
  class MyClassInside {
  }
}

public class MyClass {
  public static class MyClassInside {
  }
}

public class MyClass {
  public void method() {
    JComponent jc = new JComponent() {
      ...
    }
  }
}

public class MyClass {
  public static void myStaticMethod() {
    JComponent jc = new JComponent() {
      ...
    }
  }
}

তারা ভাষায় বর্ণিত হয়েছে (যদি আপনি সত্যিই উদ্বিগ্ন হন, স্থির পদ্ধতির অভ্যন্তরের জন্য বিভাগ 15.9.5.1 দেখুন)।

তবে এই উদ্ধৃতিটি কেবল সাধারণ ভুল :

javac.exe স্থিতিশীল আরম্ভ কোড এবং স্থির পদ্ধতিগুলির মধ্যে বেনামে ক্লাসের অনুমতি দেবে, যদিও ভাষা বর্ণটি অজ্ঞাত শ্রেণির তুলনায় কখনও স্থির হয় না though

আমি মনে করি উদ্ধৃত লেখক স্থির প্রসঙ্গে স্ট্যাটিক কীওয়ার্ডকে বিভ্রান্ত করছেন । (স্বীকার করেছেন, জেএলএসও এ ক্ষেত্রে কিছুটা বিভ্রান্ত।)

সত্যিই, উপরের সমস্ত নিদর্শনগুলি ভাল (আপনি তাদের "নেস্টেড", "অন্তর্হীন", "বেনামে" যাই হোক না কেন ...) বলুন। সত্যিই, জাভা পরবর্তী প্রকাশে হঠাৎ কেউ এই কার্যকারিতাটি সরাবেন না। সত্যি বলতে!


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

2
আমরা আসলে কোনও নিদর্শন সম্পর্কে কথা বলছি না। আমরা বোঝাতে চাইছি অনামী নেস্টেড ক্লাসটি অচল। অর্থাৎ আপনার তৃতীয় উদাহরণের মধ্যে newএবং "স্ট্যাটিক" যুক্ত করুন JComponent
টিম্ম্ম্ম

আমি কী চাইছে তা দেখানোর জন্য মূল প্রশ্নের সাথে একটি ব্যাখ্যা যুক্ত করেছি।
টিএমএমএম

@ মিশেলমায়ারস, জেএলএস-এর সর্বদা ডিক্টেশনটি ব্যাখ্যা করা দরকার।
পেসারিয়ার

6

অভ্যন্তরীণ ক্লাসগুলি স্থির হতে পারে না - একটি স্থির নেস্টেড বর্গ কোনও অভ্যন্তর শ্রেণি নয়। জাভা টিউটোরিয়ালটি এখানে এটি সম্পর্কে আলোচনা করে


1
আমি অফিসিয়াল নামকরণের রেফারেন্স সহ প্রশ্নটি আপডেট করেছি।
থিলো

0

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


-3

স্থির পদ্ধতিতে তাদের কল করে বেনামে অভ্যন্তর শ্রেণীর স্থির করার নোটে।

এটি আসলে উল্লেখটি সরিয়ে দেয় না। আপনি বেনাম শ্রেণিটি সিরিয়াল করার চেষ্টা করে এবং এনকোলেসিং ক্লাসকে সিরিয়ালযোগ্য না করে পরীক্ষা করতে পারেন।


5
-1: একটি স্ট্যাটিক পদ্ধতি মধ্যে একটি বেনামী বর্গ তৈরি করা হচ্ছে আসলে নেই বাইরের শ্রেণী রেফারেন্স মুছে ফেলুন। আপনি বেনাম শ্রেণিটি সিরিয়াল করার চেষ্টা করে এবং এনকোলেসিং ক্লাসকে সিরিয়ালযোগ্য না করে পরীক্ষা করতে পারেন। (আমি সবেমাত্র করেছি।)
খ্রিস্টান সেমরাউ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.