জাভা: স্থির পদ্ধতি কখন ব্যবহার করতে হবে


911

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

যেমন

Obj x = new Obj();
x.someMethod

অথবা

Obj.someMethod

(এটি কি স্থির উপায়?)

আমি বরং বিভ্রান্ত!

উত্তর:


1458

থাম্বের একটি নিয়ম: নিজেকে জিজ্ঞাসা করুন "কোনও বস্তু এখনও নির্মিত না হলেও, এই পদ্ধতিটি কল করা কি বোধগম্য?" যদি তা হয় তবে তা অবশ্যই স্থির থাকবে।

সুতরাং একটি ক্লাসে Carআপনার একটি পদ্ধতি থাকতে পারে:

double convertMpgToKpl(double mpg)

... যা স্থির হবে, কারণ কেউ হয়ত জানতে চায় যে 35 এমপিজি রূপান্তরিত করে, এমনকি যদি কেউ কখনও এটি তৈরি করে না Car। তবে এই পদ্ধতিটি (যা একটি বিশেষের দক্ষতা নির্ধারণ করে Car):

void setMileage(double mpg)

... স্থির হতে পারে না কারণ যে কোনও Carনির্মাণের আগে পদ্ধতিটি কল করা অকল্পনীয় ।

(যাইহোক, কথোপকথনটি সবসময় সত্য হয় না: আপনার মাঝে মাঝে এমন কোনও পদ্ধতি থাকতে পারে যা দুটি Carঅবজেক্টের সাথে জড়িত থাকে এবং এখনও এটি স্থির থাকতে চায় Eg যেমন:

Car theMoreEfficientOf( Car c1, Car c2 )

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


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

34
আমি মনে করি আমি বরং পদ্ধতিটি করব Car#isMoreEfficientThan(Car)। আপনি যে গাড়িটি টাই করে ফিরিয়ে আনবেন তা সুবিধাজনক নয়। টাইতে কী ফিরে আসে সেই পদ্ধতির শিরোনাম দ্বারা এটি সুস্পষ্ট।
ক্রাঙ্কার

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

7
আসলে এটি তুলনাকারী হিসাবে প্রয়োগ করা উচিত ।
ডগওয়েদার

3
@ বি 1 কে মিউজিক অবশ্যই। "কোন গাড়িটি টাইয়ে ফিরে আসে" বলতে আমি কী বোঝাতে চাইছি তা হ'ল "গাড়িতে কল করা সত্যিকারের মানচিত্র এবং উত্তীর্ণ গাড়ীতে ভুয়া মানচিত্র"। এটি অস্পষ্টতা ছাড়াই।
ক্রুঙ্কার

538

শুধুমাত্র নিম্নলিখিত পরিস্থিতিতে দৃic় পদ্ধতিগুলি সংজ্ঞায়িত করুন:

  1. আপনি যদি ইউটিলিটি ক্লাস লিখছেন এবং সেগুলি পরিবর্তন করার কথা নয়।
  2. পদ্ধতিটি যদি কোনও উদাহরণ ভেরিয়েবল ব্যবহার না করে।
  3. যদি কোনও অপারেশন উদাহরণস্বরূপ সৃষ্টির উপর নির্ভরশীল না হয়।
  4. যদি এমন কিছু কোড থাকে যা সহজেই সমস্ত দৃষ্টান্ত পদ্ধতিতে ভাগ করে নেওয়া যায় তবে সেই কোডটি একটি স্ট্যাটিক পদ্ধতিতে বের করুন।
  5. আপনি যদি নিশ্চিত হন যে পদ্ধতির সংজ্ঞাটি কখনও পরিবর্তন বা ওভাররাইড করা হবে না। স্থির পদ্ধতিতে ওভাররাইড করা যায় না।

45
ভাল পয়েন্টগুলি, তবে সেগুলি প্রয়োজনীয়তাগুলি যদি আপনি কোনও পদ্ধতিটিকে স্থিতিশীল করতে চান তবে কোনওটি তৈরি করার কারণ নয়।
tetsuo

4
প্রয়োজনীয়তার বিষয়ে @ মোহাম্মদ ৫: আপনি কখনই 100% নিশ্চিত হতে পারবেন যে কোনও পদ্ধতি কখনই পরিবর্তন হবে না বা ওভাররাইড হবে না? আপনি নিজের অচল পদ্ধতিটি লেখার মুহুর্তে আপনি কি সবসময় অজানা কারণগুলি বিবেচনায় নিতে পারবেন না?
পিক্সেলপ্লেক্স

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

2
@ মোহাম্মদ এই উত্তরটি আমি ঠিক যা খুঁজছি is মাল্টিথ্রেডিংয়ে স্থির পদ্ধতি ব্যবহার করে আমি প্রচুর সমস্যার মুখোমুখি হয়েছি। আপনি কী দয়া করে আরও 2 পয়েন্ট বিশদ বিবরণ দিতে পারেন (উদাহরণস্বরূপ 100 টি থাম্বস আপ আপনার জন্য)
প্রকাশ পান্ডে

আমি মনে করি আপনি যদি স্ট্যাটিক ভেরিয়েবল এবং পদ্ধতি ব্যবহার করতে চলেছেন তবে একটি "স্ট্যাটিক ক্লাস" আবিষ্কার করা উচিত।
রবার্ট রোচা

182

স্থির পদ্ধতিগুলি ব্যবহারের কিছু বৈধ কারণ রয়েছে:

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

  • ব্যবহারিকতা : কলিং new Util().method(arg), কল Util.method(arg)বা method(arg)স্থির আমদানির পরিবর্তে আরও সহজ, খাটো।

  • পদ্ধতি যুক্ত করার পদ্ধতি : আপনি স্ট্রিংয়ের প্রকৃতপক্ষে একটি removeSpecialChars()উদাহরণ পদ্ধতি থাকা চাইলেও এটিটি নেই (এবং এটি হওয়া উচিত নয়, যেহেতু আপনার প্রকল্পের বিশেষ অক্ষরগুলি অন্য প্রকল্পের চেয়ে আলাদা হতে পারে), এবং আপনি এটি যুক্ত করতে পারবেন না (জাভা থেকে কিছুটা বুদ্ধিমান), তাই আপনি একটি ইউটিলিটি ক্লাস তৈরি করেন এবং এর removeSpecialChars(s)পরিবর্তে কল করুন s.removeSpecialChars()। মিষ্টি।

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

আপনি যদি একটি সিঙ্গলটন বানাতে চান তবে আপনাকে একটি স্থিতিশীল পদ্ধতিও তৈরি করতে হবে, কিন্তু ... করবেন না। মানে, দু'বার ভাবুন।

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


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

ধন্যবাদ! আপনার ব্যাখ্যাটি খুব স্পষ্ট এবং প্রদত্ত কারণগুলি খুব যৌক্তিক এবং প্রচুর অর্থবোধ করে।
ডেনিস এম

3
এবং আমরা প্রোগ্রামাররা শীতল হওয়ার কারণে কখনও অপ্রয়োজনীয় কাজগুলি করে না? +1
স্কারামোচে

তাই বলা হয় একটি স্ট্যাটিক পদ্ধতি একটি পূর্ণ নামে ফাংশন হয়ে stackoverflow.com/questions/155609/...
Ivanzinho

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

42

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

আমি কীভাবে নিশ্চিত করব যে আমার কাছে কেবল কিছু আছে

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

স্থির পদ্ধতিগুলির সাথে প্রাথমিক সমস্যাটি হ'ল তারা হ'ল পদ্ধতিগত কোড

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


20
ইউনিট-পরীক্ষামূলক পদ্ধতিতে কোড সক্ষম করতে না পারার অংশটি আমি বুঝতে পারি না। আপনি কি কেবল পরীক্ষার কেসগুলি সেট আপ করেন না যা আপনার "ইউনিট" হিসাবে ক্লাসের সাথে স্থির পদ্ধতিটি ব্যবহার করে আউটপুট সঠিক করতে সঠিক ইনপুট ম্যাপ করে?
tjb

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

4
@Alfred: দয়া করে কটাক্ষপাত আছে PowerMock যা উপহাস স্ট্যাটিক পদ্ধতি করার ক্ষমতা আছে। পাওয়ারমক ব্যবহার করে এমন কয়েকটি পরিস্থিতি রয়েছে, যদি কোনও হয়, যেখানে আপনি পদ্ধতি নির্ভরতা খুঁজে পান যা উপহাস করা যায় না।
কার্লস সালা

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

14
স্থিতিশীল অবস্থার উপর নির্ভরশীল স্ট্যাটিক পদ্ধতিগুলির পরীক্ষার অসুবিধা আমি বুঝতে পারি। কিন্তু আপনি যখন স্টেটলেস স্ট্যাটিক পদ্ধতিগুলির মতো Math.abs()বা Arrays.sort()এমনকি এমন সমস্ত পদ্ধতির মাধ্যমেও পরীক্ষা করতে পারেন যা আপনি সমস্ত নির্ভরতা পাস করতে পারেন তবে আমি দেখতে পাচ্ছি না যে এটি কীভাবে ইউনিট পরীক্ষায় বাধা সৃষ্টি করবে। আমি বলব থাম্বের একটি সহজ নিয়ম হ'ল: যদি আপনার কাছে পদ্ধতিগত যুক্তি উপহাস করার কোনও কারণ থাকে তবে তা স্থির পদ্ধতিতে রাখবেন না। আমি কখনও বিদ্রূপ করার Arrays.sort()বা কারণ খুঁজে পাইনি Math.abs()
অ্যান্ডি

36

একটি staticপদ্ধতি হ'ল এক প্রকারের পদ্ধতি যা কল করার জন্য কোনও বস্তুর প্রারম্ভিক প্রয়োজন হয় না। আপনি কি খেয়াল করেছেন জাভাতে ফাংশনে staticব্যবহৃত হয় main? কোনও প্রোগ্রাম তৈরি না করেই সেখান থেকে প্রোগ্রামের সম্পাদনা শুরু হয়।

নিম্নলিখিত উদাহরণ বিবেচনা করুন:

 class Languages 
 {
     public static void main(String[] args) 
     {
         display();
     }

     static void display() 
     {
         System.out.println("Java is my favorite programming language.");
     }
  }

সেরা উত্তর আসলে
ইয়াহিয়া

20

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


12

না, স্থির পদ্ধতি কোনও উদাহরণের সাথে সম্পর্কিত নয়; তারা শ্রেণীর অন্তর্গত। স্থির পদ্ধতিগুলি আপনার দ্বিতীয় উদাহরণ; উদাহরণ পদ্ধতি প্রথম।


1
যদি অবজেক্টের স্টেট ম্যানিপুলেশনগুলির প্রয়োজন না হয় তবে আপনার স্থির পদ্ধতিগুলি ব্যবহার করা উচিত।
মাস্তআভালোনস

11

আপনি যদি কোনও পদ্ধতির সাথে স্ট্যাটিক কীওয়ার্ড প্রয়োগ করেন তবে এটি স্ট্যাটিক পদ্ধতি হিসাবে পরিচিত।

  1. একটি স্ট্যাটিক পদ্ধতি কোনও শ্রেণীর অবজেক্টের চেয়ে ক্লাসের অন্তর্গত।
  2. একটি স্ট্যাটিক পদ্ধতি কোনও শ্রেণীর উদাহরণ তৈরি করার প্রয়োজন ছাড়াই ডাকে।
  3. স্ট্যাটিক পদ্ধতি স্ট্যাটিক ডেটা সদস্যকে অ্যাক্সেস করতে পারে এবং এর মান পরিবর্তন করতে পারে।
  4. একটি স্থির পদ্ধতিতে কেবল শ্রেণির বিন্দু স্থির নাম ব্যবহার করে অ্যাক্সেস করা যায়। । । উদাহরণ: Student9.change ();
  5. আপনি যদি কোনও শ্রেণির অ স্থিতিশীল ক্ষেত্রগুলি ব্যবহার করতে চান তবে আপনাকে অবশ্যই একটি অ স্থিতিক পদ্ধতি ব্যবহার করতে হবে।

// সমস্ত বস্তুর সাধারণ সম্পত্তি পরিবর্তন করার প্রোগ্রাম (স্থির ক্ষেত্র)।

class Student9{  
 int rollno;  
 String name;  
 static String college = "ITS";  

 static void change(){  
 college = "BBDIT";  
 }  

 Student9(int r, String n){  
 rollno = r;  
 name = n;  
 }  

 void display (){System.out.println(rollno+" "+name+" "+college);}  

public static void main(String args[]){  
Student9.change();  

Student9 s1 = new Student9 (111,"Indian");  
Student9 s2 = new Student9 (222,"American");  
Student9 s3 = new Student9 (333,"China");  

s1.display();  
s2.display();  
s3.display();  
}  }

ও / পি: 111 ভারতীয় বিবিডিআইটি 222 আমেরিকান বিবিডিআইটি 333 চীন বিবিডিআইটি


10

স্থির পদ্ধতিগুলি উদাহরণের সাথে সম্পর্কিত নয়, তাই তারা শ্রেণিতে কোনও অ-স্থিতিশীল ক্ষেত্রে অ্যাক্সেস করতে পারে না।

পদ্ধতিটি কোনও শ্রেণীর কোনও ক্ষেত্র (বা কেবল স্থির ক্ষেত্র) ব্যবহার না করে আপনি একটি স্থিতিশীল পদ্ধতি ব্যবহার করবেন।

যদি কোনও শ্রেণীর কোনও অ-স্থিতিশীল ক্ষেত্র ব্যবহার করা হয় তবে আপনাকে অবশ্যই একটি অ স্থির পদ্ধতি ব্যবহার করতে হবে।


1
পরিষ্কার, সংক্ষিপ্ত এবং সহজ উত্তর।
জোসি

8

স্থিতিশীল পদ্ধতিগুলি ক্লাসে কল করা উচিত, ইনস্ট্যান্স পদ্ধতিগুলি ক্লাসের উদাহরণগুলিতে কল করা উচিত। কিন্তু বাস্তবে এর অর্থ কী? এখানে একটি দরকারী উদাহরণ:

কার শ্রেণিতে এক্সিলারেট () নামে একটি উদাহরণ পদ্ধতি থাকতে পারে। আপনি কেবলমাত্র একটি গাড়ী ত্বরান্বিত করতে পারেন, যদি গাড়িটি আসলে উপস্থিত থাকে (নির্মিত হয়েছে) এবং সুতরাং এটি একটি উদাহরণ পদ্ধতি হবে।

কার শ্রেণিতে গেটকারকাউন্ট () নামে একটি গণনা পদ্ধতিও থাকতে পারে। এটি তৈরি করা মোট গাড়ি সংখ্যা (বা নির্মিত) ফিরিয়ে দেবে। যদি কোনও গাড়ি তৈরি না করা হয়, তবে এই পদ্ধতিটি 0 ফেরত আসবে তবে এটি এখনও কল হতে সক্ষম হওয়া উচিত, এবং তাই এটি একটি স্ট্যাটিক পদ্ধতি হতে হবে।


6

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


স্ট্যাটিক ভেরিয়েবলগুলিতে স্টেট রাখা অনেক কারণের জন্য করণীয় - যেমন মাল্টি-থ্রেডিং সুরক্ষা, ডিবাগিং, ডেটা-এনক্যাপসুলেশন.. ইত্যাদি ইত্যাদি স্থির পদ্ধতিগুলি যদি খাঁটি ফাংশন হয় তবে (সেগুলি পরিবর্তন না করে কেবল প্যারামের সাথে কাজ করুন)। গণিতের গণনা বলার জন্য ভাল উদাহরণটি একটি ইউটিলিটি ক্লাস হবে।
ভ্লাদিমির ডেমিরিভ

5

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


29
এটি কোনও প্রোগ্রামের ডিজাইনের জন্য কোনও যুক্তি দেয় না।
আদমজমার্কাম

4

স্ট্যাটিক: Obj.someMethod

staticআপনি যখন কোনও পদ্ধতিতে ক্লাস স্তরের অ্যাক্সেস সরবরাহ করতে চান তখন ব্যবহার করুন , যেখানে ক্লাসের উদাহরণ ছাড়াই পদ্ধতিটি কলযোগ্য হবে।


4

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


1
হ্যাঁ! জাভা নুবি প্রশ্নগুলি গুগল করার সময় আমি কোথায় এসেছি দেখুন! এটি একটি ছোট্ট বিশ্ব :-)
দীপক

1
@ দীপক ছোট্ট দুনিয়া আসলেই :)
বৈশাখ সুরেশ

4

স্থির পদ্ধতি এবং ভেরিয়েবলগুলি জাভাতে 'গ্লোবাল' ফাংশন এবং ভেরিয়েবলগুলির নিয়ন্ত্রিত সংস্করণ। কোন পদ্ধতিতে classname.methodName()বা হিসাবে ব্যবহার করা যেতে পারে classInstanceName.methodName(), অর্থাত্ স্থির পদ্ধতি এবং পরিবর্তনশীল শ্রেণীর নাম ব্যবহারের পাশাপাশি শ্রেণীর উদাহরণগুলি ব্যবহার করা যেতে পারে।

শ্রেণিকে স্থির হিসাবে ঘোষিত করা যায় না (কারণ এটি কোনও অর্থবোধ করে না a


3

স্থিতিশীল পদ্ধতি ব্যবহার করা যেতে পারে যদি

  • কেউ উদাহরণস্বরূপ কোনও কার্য সম্পাদন করতে চায় না (ইউটিলিটি পদ্ধতি)

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

    1. new ABCClass(double farenheit).convertFarenheitToCelcium() 
    2. ABCClass.convertFarenheitToCelcium(double farenheit)

    প্রাক্তন প্রতিটি পদ্ধতির জন্য একটি নতুন শ্রেণির পদচিহ্ন তৈরি করে, পারফরম্যান্স, প্রাকটিক্যাল । উদাহরণগুলি হ'ল নীচে ম্যাথ এবং অ্যাপাচি-কমন্স লাইব্রেরি স্ট্রিং ইউটিস ক্লাস:

    Math.random()
    Math.sqrt(double)
    Math.min(int, int)
    StringUtils.isEmpty(String)
    StringUtils.isBlank(String)
  • একটি সাধারণ ফাংশন হিসাবে ব্যবহার করতে চায়। ইনপুটগুলি স্পষ্টভাবে পাস করা হয়, এবং ফলাফলের ডেটা রিটার্ন মান হিসাবে প্রাপ্ত হয়। উত্তরাধিকার, বস্তুর তাত্ক্ষণিকতা ছবিতে আসে না। সংক্ষিপ্ত, পাঠযোগ্য

দ্রষ্টব্য : অল্প কিছু লোক স্থিতিশীল পদ্ধতির টেস্টিবিলিটির বিরুদ্ধে তর্ক করে, তবে স্থির পদ্ধতিগুলিও পরীক্ষা করা যায়! JMockit এর সাহায্যে স্থির পদ্ধতিগুলি উপহাস করা যায়। পরীক্ষাযোগ্যতা । নীচে উদাহরণ:

new MockUp<ClassName>() {
    @Mock
    public int doSomething(Input input1, Input input2){
        return returnValue;
    }
};

3

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

উদাহরণস্বরূপ আমরা যখন পদ্ধতি ব্যবহারের প্রয়োজন নেই তখন আমরা স্থিতিশীল পদ্ধতি ব্যবহার করি।


2

আমি ভাবছি কখন স্থির পদ্ধতি ব্যবহার করব?

  1. staticপদ্ধতির জন্য সাধারণ ব্যবহার হল staticক্ষেত্রগুলি অ্যাক্সেস করা ।
  2. তবে আপনার staticপদ্ধতিগুলি staticভেরিয়েবলগুলি উল্লেখ না করেই থাকতে পারে । staticভেরিয়েবল উল্লেখ না করে সাহায্যকারী পদ্ধতিগুলি জাভা.লাং.মথের মতো কয়েকটি জাভা ক্লাসে পাওয়া যায়

    public static int min(int a, int b) {
        return (a <= b) ? a : b;
    }
  3. অন্যান্য ব্যবহারের ক্ষেত্রে, আমি পদ্ধতির সাথে মিলিত এই পদ্ধতিগুলি সম্পর্কে ভাবতে পারি তা synchronizedহল বহু স্তরযুক্ত পরিবেশে শ্রেণি স্তরের লক প্রয়োগ।

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

আপনার যদি শ্রেণীর কোনও ইনস্ট্যান্স অবজেক্টে পদ্ধতি অ্যাক্সেসের প্রয়োজন হয় তবে আপনার পদ্ধতিটি অচল থাকতে হবে।

ওরাকল ডকুমেন্টেশন পৃষ্ঠাটি আরও বিশদ সরবরাহ করে।

উদাহরণস্বরূপ এবং শ্রেণি ভেরিয়েবল এবং পদ্ধতিগুলির সমস্ত সংমিশ্রণ অনুমোদিত নয়:

  1. দৃষ্টান্ত পদ্ধতিগুলি সরাসরি চলক এবং উদাহরণ পদ্ধতি অ্যাক্সেস করতে পারে।
  2. ইনস্ট্যান্স পদ্ধতিগুলি ক্লাস ভেরিয়েবল এবং ক্লাস পদ্ধতিগুলি সরাসরি অ্যাক্সেস করতে পারে।
  3. ক্লাস পদ্ধতিগুলি ক্লাস ভেরিয়েবল এবং ক্লাসের পদ্ধতিগুলি সরাসরি অ্যাক্সেস করতে পারে।
  4. শ্রেণি পদ্ধতিগুলি সরাসরি চলকগুলি বা উদাহরণের পদ্ধতিগুলি সরাসরি অ্যাক্সেস করতে পারে না an তাদের অবশ্যই অবজেক্ট রেফারেন্স ব্যবহার করতে হবে। এছাড়াও, শ্রেণি পদ্ধতিগুলি এই কীওয়ার্ডটি ব্যবহার করতে পারে না কারণ এটি উল্লেখ করার কোনও উদাহরণ নেই।

আমরা কি নিয়মিত পদ্ধতির মাধ্যমে স্থির ক্ষেত্রগুলি অ্যাক্সেস করতে পারি না? তাহলে এটি A common use for static methods is to access static fields.কোন যুক্তি নয়।
পার্সিকার

2

একটি স্থিতিশীল পদ্ধতির দুটি প্রধান উদ্দেশ্য থাকে:

  1. ইউটিলিটি বা সহায়তা পদ্ধতিগুলির জন্য যা কোনও অবজেক্টের স্থিতির প্রয়োজন হয় না। যেহেতু ইনস্ট্যান্স ভেরিয়েবলগুলি অ্যাক্সেস করার প্রয়োজন নেই, স্ট্যাটিক পদ্ধতি থাকার কারণে কলকারীকে কেবল পদ্ধতিটি কল করার জন্য অবজেক্টটি ইনস্ট্যান্ট করার প্রয়োজনীয়তা দূর হয়।
  2. রাষ্ট্রের জন্য যা শ্রেণীর সমস্ত দৃষ্টান্ত যেমন কাউন্টার হিসাবে ভাগ করে নেওয়া হয়। সমস্ত উদাহরণ একই অবস্থা ভাগ করতে হবে। যে রাষ্ট্রগুলি কেবলমাত্র সেই রাষ্ট্রটি ব্যবহার করে সেগুলিও স্থিতিশীল হওয়া উচিত।

1

গ্রহনে আপনি একটি সতর্কতা সক্ষম করতে পারেন যা আপনাকে সম্ভাব্য স্থির পদ্ধতিগুলি সনাক্ত করতে সহায়তা করে। (হাইলাইট করা লাইনের উপরে আমি হাইলাইট করতে ভুলে গিয়েছি)

গ্রহপ সেটিং


0

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

উদাহরণ:

public class Demo
{
   public static void main(String... args) 
   {
      Demo d = new Demo();

      System.out.println("This static method is executed by JVM");

     //Now to call the static method Displ() you can use the below methods:
           Displ(); //By method name itself    
      Demo.Displ(); //By using class name//Recommended
         d.Displ(); //By using instance //Not recommended
   }

   public static void Displ()
   {
      System.out.println("This static method needs to be called explicitly");
   }
} 

আউটপুট: - এই স্থির পদ্ধতিটি জেভিএম দ্বারা সম্পাদন করা হয় এই স্থির পদ্ধতিটি স্পষ্টভাবে বলা দরকার এই স্থির পদ্ধতিটি স্পষ্টভাবে বলা প্রয়োজন এই স্থির পদ্ধতিটি স্পষ্টভাবে বলা প্রয়োজন

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