জাভা কেন আমাদের ফাইলের নামের চেয়ে আলাদা নামের সাথে একটি ক্লাস সংকলন করতে দেয়?


170

আমার Test.javaভিতরে একটি ফাইল এবং নীচের কোড রয়েছে।

public class Abcd
{
        //some code here

}

এখন ক্লাসটি সংকলন করে না, তবে আমি যখন publicমডিফায়ারটি সরিয়ে ফেলি তখন এটি সূক্ষ্ম সংকলন করে।

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

আমি জানি এটি একটি নবাগত প্রশ্ন, তবে আমি একটি ভাল ব্যাখ্যা খুঁজে পাচ্ছি না।


28
কারণ জাভা (কারণ এটি প্রকাশ্য নয়, এবং একই নামকরণের সম্মেলনটি অনুসরণ করতে হবে না that এর বাইরেও, আপনাকে যে উদ্ভাবন করা হয়েছিল তাদের জিজ্ঞাসা করা দরকার))
ডেভ নিউটন

2
আমার সন্দেহ আছে এর একটা "ভাল ব্যাখ্যা" আছে। এটি পাবলিক ক্লাসগুলির জন্য প্রয়োজনীয়তা ছিল তবে এটি জন-সরকারী শ্রেণীর জন্য অপ্রয়োজনীয় বলে মনে করা হয়েছিল।
কেয়ামান

2
একটি অনুরূপ প্রশ্ন মত মনে হয়: stackoverflow.com/questions/7633631/...
সংকেত

4
কেন এই প্রশ্নের জন্য এতগুলি আপত্তি, তার প্রথমটির সদৃশ প্রশ্নটির প্রথম: স্ট্যাকওভারফ্লো
জিএম রমেশ

2
@ রমেশ: এই প্রশ্নের শিরোনাম এবং বিষয়বস্তু ভাল .. (অন্যান্য
অনুরূপগুলির

উত্তর:


325

যুক্তিটি হ'ল .javaফাইল প্রতি ফাইলের জন্য একাধিক শীর্ষ স্তরের শ্রেণীর অনুমতি দেওয়া ।

অনেক শ্রেনী - যেমন ইভেন্ট শ্রোতারা local কেবল স্থানীয় ব্যবহারের এবং জাভার প্রাথমিক সংস্করণগুলি নেস্টেড ক্লাসগুলিকে সমর্থন করে না। "ফাইলের নাম = শ্রেণীর নাম" নিয়মের এই শিথিলতা ছাড়াই ছোট ছোট .javaফাইলগুলির অবিরাম বিস্তার এবং শক্তভাবে সংযুক্ত কোডের বিচ্ছুরণের অনিবার্য ফলাফল সহ এই জাতীয় প্রতিটি শ্রেণীর নিজস্ব ফাইলের প্রয়োজন হত ।

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


60
+1, এটি আসলে একটি কারণ সরবরাহ করে যা প্রশ্ন।
ডেভ নিউটন

4
Especiallyতিহাসিক তথ্যের জন্য বিশেষত +1 - আমার সন্দেহ হয় যে নেস্টেড / বেনাম শ্রেণীর আবির্ভাবের সাথে যদি এখন একই সিদ্ধান্ত নেওয়া হত (পিছনের দিকের সামঞ্জস্যতা সম্পর্কে যত্নশীল না হও) তবে প্রতি এক শীর্ষ স্তরের শ্রেণিকে অনুমতি দেওয়া আরও অনেক বেশি অর্থবোধ করবে ফাইল।
মাইকেল বেরি

1
@ berry120 বেশ সম্ভবত, কারণ এই ভাতাটি কম্পাইল করার সময় ফাইল অনুসন্ধানকে জটিল করে তোলে।
মার্কো টপোলনিক

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

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

80

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

অফিসিয়াল নাম বা মাইক্লাস.জভা মিটিং রুম বা টেস্ট.জভা


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

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

@ মারকো টপলনিক এর সাথে আমার জড়িত হওয়া উচিত ছিল না; আমি ক্লাস- এ সাদৃশ্যগুলিতে ভয়াবহ ! ;)
অ্যান্ড্রু বারবার

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

@ অ্যান্ড্রুবার্বার, সাদৃশ্যটি ডিরেক্টরিটির ধারণাটিকে পুরোপুরি ফিট করে, দীর্ঘ করিডোরটিতে আপনি কেবলমাত্র দরজার প্লেটে তাকিয়ে একজনকে খুঁজে পেতে পারেন, আপনাকে প্রতিটি ঘরে প্রবেশ করে জিজ্ঞাসা করার দরকার নেই।
এক্সবুক 15

29

জাভা স্পেসিফিকেশন জানিয়েছে যে আপনার কাছে প্রতি ফাইলটিতে সর্বাধিক একটি সর্বজনীন শ্রেণী থাকতে পারে। এই ক্ষেত্রে ক্লাসের নামটি ফাইলের নামের সাথে মিলে যায়। সমস্ত অ-পাবলিক ক্লাসে ফাইলের নাম নির্বিশেষে কোনও নাম থাকার অনুমতি রয়েছে।


20
তবে "জাভা আমাদের অনুমতি দেওয়ার পিছনে কী যুক্তি দিচ্ছে" আমাদের এটিকে?
মার্কো টপোলনিক

@ মারকো টপলনিক কারণ এটি আমাদের বাধা দেয় না: ডি
মেরুন

8
@ মারাউনমারুন কিন্তু আমাদের বাধা না দেওয়ার পিছনে যুক্তি কী?
মার্কো টপোলনিক

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

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

13

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

ওরাকলের ওয়েবসাইটে নেস্টেড ক্লাস জাভা টিউটোরিয়ালে সমস্ত নেস্টেড ক্লাসগুলির একটি ভাল ব্যাখ্যা রয়েছে , যার প্রতিটি উদাহরণ রয়েছে। এটিগুলির কার্যকর হওয়ারও একটি কারণ রয়েছে, যা আমি উদ্ধৃত করব:

নেস্টেড ক্লাস কেন ব্যবহার করবেন?

নেস্টেড ক্লাসগুলি ব্যবহারের জন্য বাধ্য করার কারণগুলির মধ্যে নিম্নলিখিতগুলি অন্তর্ভুক্ত রয়েছে:

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

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

  • এটি আরও পঠনযোগ্য এবং রক্ষণাবেক্ষণযোগ্য কোডের দিকে নিয়ে যেতে পারে : শীর্ষ স্তরের শ্রেণির মধ্যে ছোট ছোট ক্লাসগুলিতে বাসা বাঁধাই কোডটি যেখানে ব্যবহৃত হয় তার কাছাকাছি রাখে।

(জোর আমার)

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


একটি ক্ষেত্রে কেবল একটি টাইপ কেবল অন্য ধরণের ক্ষেত্রে কার্যকর হয় তবে কী করা উচিত তবে আগের ধরণের উদাহরণগুলি পরবর্তী সময়ের উদাহরণগুলির সাথে সম্পর্কিত নয়?
সুপারক্যাট

নেস্টেড ক্লাসগুলি জাভা 1.2 ব্যবহারের ল্যাম্বডাস করার পদ্ধতি বা 'প্রথম শ্রেণীর ক্রিয়াকলাপ যখন সমস্ত কিছুই একটি বস্তু হয়'। এটি 1.8 সিন্ট্যাক্সে পরিবর্তিত হচ্ছে। যখন আমরা জাভা টাইপ সিস্টেমে বীজগণিত ডেটা প্রকারের মডেল করতে চাই তখন সেগুলিও ব্যবহৃত হয়।
হক্কে

12

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


4

নোট করুন যে জাভা কেস-সংবেদনশীল তবে ফাইল সিস্টেমের দরকার নেই। যদি ফাইলটির ভিত্তির নাম "অ্যাবসিডি" হয় তবে শ্রেণিটি "অ্যাবসিডি" হয়, তবে এটি কি কেস-সংবেদনশীল ফাইল সিস্টেমের নিয়মের সাথে সামঞ্জস্য হয়? অবশ্যই কোনও কেস-সংবেদনশীলকে পোর্ট করা হয় না।

অথবা ধরুন আপনি ABCD নামে একটি ক্লাস, এবং একটি ক্লাস Abcd করেছেন (আসুন এটি একটি খারাপ ধারণা হওয়ার কারণে notোকাবেন না: এটি ঘটতে পারে) এবং প্রোগ্রামটি কেস সংবেদনশীল ফাইল সিস্টেমে পোর্ট করা হয়েছে। এখন আপনাকে কেবল ফাইলের নাম পরিবর্তন করতে হবে না, ক্লাসগুলিও আছে উফ!

বা ফাইল না থাকলে কী হবে? মনে করুন আপনার কাছে একটি জাভা সংকলক রয়েছে যা স্ট্যান্ডার্ড ইনপুটটিতে ইনপুট নিতে পারে। তাহলে কি ক্লাসের নাম রাখতে হবে "স্ট্যান্ডার্ড ইনপুট"?

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


আপনার যা বলার আছে তা নিয়ে আমি একমত, তবে আমি জানি না যে এটি বিশেষত এই প্রশ্নের উত্তর দেয়, সম্ভবত নামকরণ আর্কিটেকচারের ফলে প্রাপ্ত কিছু সমস্যা অ-পাবলিক শ্রেণীর নামগুলি থেকে আলাদা করার অনুমতি দিয়ে এড়াতে পারে except ফাইলের নাম। BTW, কেস-সংবেদনশীলতা ব্যাপারে, আমি যদি একটি ভাষা আহরিত হয়, কোনো সুযোগ ছিল Fooঘোষণা করা হয়, শনাক্তকারী FOO, foo, fOo, ইত্যাদি সমস্ত "undefined" হবে এমনকি যদি তারা বাইরের সুযোগ মধ্যে অস্তিত্ব। এই জাতীয় নকশা ফাইল নামগুলির ক্ষেত্রে কেস-সংবেদনশীলতা সমস্যাটি দূর করবে।
সুপারক্যাট

3

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


0

জাভা ফাইলে একাধিক শ্রেণি থাকতে পারে বলে এতে একটি জাভা ফাইলে দুটি ক্লাস থাকতে পারে। তবে একটি জাভা ফাইলের মধ্যে কোনও সার্বজনীন ক্লাস থাকলে ফাইলের নামের মতো একটি শ্রেণি থাকতে হবে।


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