কেন জাভা ফাইলের নামটি আরগসে রাখে না?


20

সি এবং সি ++ এ, প্রধান পদ্ধতিটি আরগভ [0] এ অ্যারের প্রথম অবস্থানে ফাইলের নাম ধারণ করে। জাভাতে, ফাইলের নামটি আরগস স্ট্রিং অ্যারে অন্তর্ভুক্ত নয়।

এর কোন ব্যবহারিক কারণ আছে কি? আমি বুঝতে পারি যে এটি 1-ভিত্তিক পরিবর্তে 0-ভিত্তিক কমান্ড লাইন আর্গুমেন্টের মাধ্যমে পুনরাবৃত্তি করে তোলে, তবে কোনও সুবিধা আছে কি? ফাইলের নামটি কি কেবল অকেজো বলে মনে করা হয়েছিল?

উত্তর:


17

কিছু ক্ষেত্রে কোনও প্রোগ্রাম বিভিন্ন উপায়ে চালানো যেতে পারে এবং কীভাবে ডাকা হয় তার উপর বিভিন্ন আচরণ প্রদর্শন করা যায়। আপনি যদি কল vimকরেন তবে viএটি একটি সামঞ্জস্যতা মোডে চলে। কখনও কখনও এটি বিভিন্ন সম্পর্কিত প্রোগ্রামগুলির একটি সংস্করণ বজায় রাখার চেষ্টা করা হয় - উদাহরণস্বরূপ mailqএবং newaliasesঅনেকগুলি ইউনিক্স সিস্টেমে একটি লিঙ্ক হয় sendmailযাতে এই প্রোগ্রামগুলি সিঙ্কে থাকে)


জাভা প্রোগ্রামগুলি সাধারণত:

% java -jar foo.jar আরগস
% java Foo আরগস

প্রথম সংস্করণটি যেখানে আপনার একটি ম্যানিফেস্ট ফাইল রয়েছে যা মূল শ্রেণিকে নির্দেশ করে, দ্বিতীয় সংস্করণটি Fooশ্রেণীর পথে পাওয়া শ্রেণিতে মূল পদ্ধতিটি চালায় ।

জাভা জন্য উপস্থাপিত তথ্য হয় জার পথ বা শ্রেণীর নাম চাওয়া হয়।

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

জাভা অ্যাপ্লিকেশনটি চাওয়ার সাথে -jarপ্রবেশ করার একমাত্র উপায় রয়েছে - ম্যানিফেস্টে সংজ্ঞায়িত ক্লাস। এমন কোনও নামকরণও করা যায় না যা করা যায়।

শ্রেণীর নামের সাথে এটি চাওয়ার অন্য বিকল্পটি সরাসরি এক্সিকিউশন ইউনিটকে নির্দেশ করে। আরও, এটির নামকরণ করা যাবে না গুণ - এটি আপনার Bar.classপক্ষে কোড হতে পারে না class Fooএটি ঠিক সেভাবে কাজ করে না।

এটি দেখানো উচিত যে argv[0]জাভা অ্যাপ্লিকেশনটিতে সি অর্থে তথ্য স্থান দেওয়ার সত্যিকার অর্থে কোনও বক্তব্য নেই - এটি হয় javaঅর্থহীন এবং স্বেচ্ছাসেবক হতে চলেছে , বা যে শ্রেণীর নামটি আহ্বান করা হচ্ছে তার নাম হবে (যে আপনি ইতিমধ্যে কোডটি কার্যকর করছেন) এর (আপনি getClass().getEnclosingClass().getName()মরিয়া হলে এমন কিছু করতে পারেন ...))।

এখানে একটি বক্তব্য রয়েছে, আপনি একটি .jar বা শ্রেণীর পথে ক্লাসে একাধিক প্রধান পদ্ধতি সংজ্ঞায়িত করতে পারেন। এবং আপনি তাদেরকে অন্যরকমভাবে আচরণ করতে পারেন ঠিক এমনভাবে যদি বিবরণী argv[0]ছিল তবে যা ছিল তার উপর ভিত্তি করে বিবৃতি দেওয়া।

আমার অতীতে কোড সমতুল্য ছিল java -cp Foo.jar com.me.foo.Testযা Testক্লাসের মূল পদ্ধতিটি ম্যানিফেস্টে সংজ্ঞায়িত সংজ্ঞায়িত পদ্ধতির পরিবর্তে পরিবর্তিত হয়েছিল।


তার চেয়ে আরও কিছু থাকতে হবে। C #, পরামিতি ফাইলের নাম ধারণ করে না, কিন্তু আবেদন সাধারণত সরাসরি, শুধু মৃত্যুদন্ড কার্যকর করা হয় foo.exe
এসভিক

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

@nqzero ( প্রসঙ্গ ) - যদি আমি java com.me.Fooকমান্ড লাইন হিসাবে নির্দিষ্ট করি তবে পদ্ধতিটি com.me.Foo.main(String...)চালু করা হচ্ছে। যে প্রায় কোনো উপায় নেই। এবং আমি জানি যে এটি ফু-কে আহ্বান করা হচ্ছে - এটি আরগভুক্ত করার কোনও কারণ নেই। এটি নিখুঁতভাবে অপ্রয়োজনীয় তথ্য হবে। অবশ্যই, এটি সুপারক্লাসে থাকতে পারে, তবে কমান্ড লাইনটি কী ছিল সে সম্পর্কিত কাঙ্ক্ষিত তথ্যের সাথে আমার এটি বাধা দেওয়ার তুচ্ছ সুযোগ আছে - এটি আরজিভিতে রাখার দরকার নেই।

... এবং দয়া করে উত্তরের সম্পাদনাগুলির পরিবর্তে 50 টি মন্তব্য এবং মন্তব্য করা মনে রাখবেন। প্রদত্ত পোস্ট দিয়ে সমস্যা উত্থাপন করা এটি খুব দরিদ্র way

কখনও কখনও আচরণের মূলত আলাদা হয়। উদাহরণস্বরূপ wput আসলে wget হয়।
mckenzm

-4

আসলে এটির কোনও লাভ নেই, এটি 0-ভিত্তিক বা 1-ভিত্তিক হয় তবে আপনি যে প্রোগ্রামিং ভাষার ব্যবহার করছেন সেটি সিনট্যাক্সের উপর নির্ভর করে। ভেরিয়েবল (আপনি ফাইলের নাম হিসাবে উল্লেখ করেছেন) এছাড়াও ভাষার উপর নির্ভর করে, এটি অন্যান্য ভাষায় আলাদা হতে পারে কেবল আপনি যে ভাষাটি ব্যবহার করছেন তার সঠিক বাক্য গঠন অনুসরণ করে।


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