জাভা: স্ট্যাটিক ক্লাস?


130

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


14
আপনি কোনও শীর্ষ স্তরের শ্রেণি স্থির করতে পারবেন না ...
জন

উত্তর:


163

চূড়ান্ত হিসাবে চিহ্নিত ক্লাসে ব্যক্তিগত নির্মাতা এবং স্থির পদ্ধতি।


19
@ ম্যাট বি: ডেভিড রোবলস তার উত্তরে যেমন উল্লেখ করেছেন, আপনার ক্লাসটি ফাইনাল করার দরকার নেই ... এটি সাবক্ল্যাস করা যাবে না কারণ একটি সাবক্লাস একটি সুপার ক্লাস কনস্ট্রাক্টরকে আবেদন করতে অক্ষম হবে কারণ এটি ব্যক্তিগত। তবে ... সুস্পষ্ট হওয়ার কোনও ক্ষতি নেই। তবে জেফেই :-)।
টম

93

দুর্দান্ত বই "কার্যকর জাভা" অনুসারে :

আইটেম 4: একটি প্রাইভেট কনস্ট্রাক্টরের সাথে অযোগ্যতা প্রয়োগ করুন

- শ্রেণীর বিমূর্ততা তৈরি করে অযোগ্যতা প্রয়োগের প্রচেষ্টা কার্যকর হয় না।

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

// Noninstantiable utility class
public class UtilityClass
{
    // Suppress default constructor for noninstantiability
    private UtilityClass() {
        throw new AssertionError();
    }
}

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

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


1
কেন তুমি বেছে নিলেন AssertionErrorমত অন্যান্য বিকল্প উপর IllegalStateException, UnsupportedOperationException, ইত্যাদি?
পেসারিয়ার

@ পেসার এই দেখুন ।
বিসিএসবি 1001

@ bcsb1001, যে আমাদের কাছে নিয়ে আসে এই
পেসারিয়ার

21

আপনার মতামত java.lang.Math এর মতো একটি ইউটিলিটি ক্লাস রয়েছে ।
সেখানে প্রাইভেট কনস্ট্রাক্টর এবং স্থির পদ্ধতি সহ চূড়ান্ত শ্রেণি রয়েছে।

তবে পরীক্ষার জন্য এটি কী করে তা থেকে সাবধান থাকুন, আমি এই নিবন্ধটি পড়ার পরামর্শ দিচ্ছি
স্ট্যাটিক পদ্ধতিগুলি টেস্টেবলির মৃত্যুর Death


তাহলে জাভা.আলং.মথ কি "মৃত্যুর পরীক্ষার"?
পেসারিয়ার


6

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

আমার 0 .02


17
সিলেটলেটগুলিও মন্দ বলে বিবেচিত হয়।
ড্যান ডায়ার

3
ক্লাসটি ইনস্ট্যান্টিয়েটিং বা সাবক্লাসিং থেকে কাউকে রোধ করতে আপনি ব্যক্তিগত নির্মাতা ব্যবহার করেন। ডেভিড রোবেলের
লুঠ


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

2
@ আরব রে ওও, আমি সম্মত, গণিত.আবস সম্ভবত কখনও উদাহরণ প্রয়োজন হয় না। যখন আমি শুনি "আমার একটি ইউটিলিটি ক্লাস আছে", আমি ম্যাথ.এভিজি () দেখি, যেখানে এখন আপনাকে ভারী গড়ের জন্য সমর্থনযোগ্য যুক্ত করতে হবে। আমি একটি url জেনারেটর, প্যারাম ইন, ইউআরএল দেখছি যা href, বা কেবলমাত্র url ইত্যাদি সমর্থন করার জন্য পুনঃসংশ্লিষ্ট হওয়া দরকার these এই কারণে OO ভিত্তিক ইউটিলিটি ক্লাসটি ফেরত দিতে পারে। এছাড়াও, এখন আমি স্ট্যান্ডার্ড ওও রক্ষণাত্মক কৌশল, পরীক্ষার বাদ দেব! / আমার হাঁস
বেনিট ডিল

3

"ব্যক্তিগত নির্মাণকারী" যুক্তিগুলিতে মন্তব্য করুন: আসুন, বিকাশকারীরা যে বোকা নয়; তবে তারা অলস। একটি অবজেক্ট তৈরি করে তারপর স্থির পদ্ধতি কল? হবে না।

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


7
এমন কেউ যিনি দেখেছেন (প্রোডাকশন কোডে, জাসুত স্টুডেন্ট কোড নয়) অবজেক্ট.স্ট্যাটিক ম্যাথড আমি মনে করি আপনি জো র্যান্ডম প্রোগ্রামারের দক্ষতার চেয়ে বেশি মূল্যায়ন করেছেন! :
পি

2
  • ফাইনাল ক্লাস এবং প্রাইভেট কনস্ট্রাক্টর (ভাল তবে অপরিহার্য নয়)
  • পাবলিক স্ট্যাটিক পদ্ধতি

1

ক্লাস হিসাবে ঘোষণার কোন মানে নেই static। কেবল এর পদ্ধতিগুলি ঘোষণা staticকরুন এবং শ্রেণীর নাম থেকে তাদের জাভা ম্যাথের ক্লাসের মতো স্বাভাবিক হিসাবে কল করুন ।

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


1
এছাড়াও, একটি প্রাইভেট কনস্ট্রাক্টর তৈরি করতে ভুলবেন না।
আসফ

@ আসফ: সম্মত আমি আমার উত্তরে তাতে কিছুটা যুক্ত করেছি। ধন্যবাদ।
বিল করুন

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

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