আপনি জাভাতে ধ্রুবকগুলির শ্রেণিটি কীভাবে সংজ্ঞায়িত করবেন?


90

ধরুন আপনার কোনও শ্রেণি সংজ্ঞায়িত করা দরকার যা এটির সবগুলি ধ্রুবককে ধরে রাখে।

public static final String SOME_CONST = "SOME_VALUE";

এটি করার পছন্দের উপায় কী?

  1. ইন্টারফেস
  2. বিমূর্ত শ্রেণি
  3. ফাইনাল ক্লাস

আমার কোনটি ব্যবহার করা উচিত এবং কেন?


কিছু উত্তরের স্পষ্টতা:

এনামস - আমি এনামগুলি ব্যবহার করতে যাচ্ছি না, আমি কিছু গণনা করছি না, কেবল কিছু ধ্রুবক সংগ্রহ করছি যা একে অপরের সাথে সম্পর্কিত নয়।

ইন্টারফেস - আমি ইন্টারফেস প্রয়োগ করে এমন কোনও শ্রেণি সেট করতে যাচ্ছি না। কনস্ট্যান্টকে কল করতে কেবল ইন্টারফেসটি ব্যবহার করতে চাই : ISomeInterface.SOME_CONST.


এখানে কিছু অনুরূপ আলোচনা রয়েছে: স্ট্যাকওভারফ্লো . com / প্রশ্নগুলি / ৩২০৫৮৮/২ । আমি একটি বেসরকারী নির্মাণকারীর সাথে একটি চূড়ান্ত শ্রেণি ব্যবহার করব যাতে এটি তাত্পর্যপূর্ণ করা যায় না।
ড্যান ডায়ার

4
দুঃখিত তবে "আমি এনাম ব্যবহার করতে যাচ্ছি না" এই প্রশ্নটিকে "বোকা কিছু করার সর্বোত্তম উপায় কোনটিতে" পরিণত করে?
ক্লিটাস

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

এনুম নিয়ে সমস্যা কি? আপনি সর্বদা এটি 'এমন কিছু ধ্রুবক সংগ্রহ করতে ব্যবহার করতে পারেন যা একে অপরের সাথে সম্পর্কিত নয়'। হুঁ?
gedevan

6
কনস্ট্যান্ট হিসাবে, একটি এনাম একটি খারাপ পছন্দ যদি ধ্রুবকগুলি সম্পর্কিত না হয়। একটি এনাম একই ধরণের বিকল্প মানের প্রতিনিধিত্ব করে। এই ধ্রুবকগুলি বিকল্প নয় এবং সেগুলিও একই ধরণের নাও হতে পারে (কিছু স্ট্রিং, কিছু পূর্ণসংখ্যার ইত্যাদি হতে পারে)
ড্যান ডায়ার

উত্তর:


94

একটি চূড়ান্ত ক্লাস ব্যবহার করুন। সরলতার জন্য আপনি তারপরে অন্য শ্রেণিতে আপনার মানগুলি পুনরায় ব্যবহার করতে স্ট্যাটিক আমদানি ব্যবহার করতে পারেন

public final class MyValues {
  public static final String VALUE1 = "foo";
  public static final String VALUE2 = "bar";
}

অন্য ক্লাসে:

import static MyValues.*
//...

if(variable.equals(VALUE1)){
//...
}

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

7
সুবিধাটি হ'ল ডুপ্লিকেট কোড না দেওয়ার ক্ষেত্রে, যদি আপনাকে একাধিক শ্রেণিতে স্থির পুনরায় ব্যবহার করতে হয়। আমার ধারণা আপনি সহজেই এর সুবিধা দেখতে পাবেন।
ব্যবহারকারীর 454579

4
আপনি কেন নকল কোড করবেন? শুধু অন্যান্য ক্লাস দেখুন। আমি এটি তুলনামূলকভাবে বিরল দেখতে পাই যে একটি ধ্রুবক সত্যই একা থাকে।
জন স্কিটি

14
আরও ভাল পঠনযোগ্যতার জন্য আমার একটি বডিবিহীন একটি ব্যক্তিগত ডিফল্ট নির্মাতাও থাকবেন (এবং কোনও মিলের মন্তব্য)।
রান বিরন

4
বেশ পুরানো উত্তর, এবং এই মন্তব্যটি সম্ভবত সম্ভবত স্থানের বাইরে রয়েছে, তবে VALUE1.equals(variable)এটি এনপিই এড়ানো হিসাবে আমি ব্যবহার করব ।
আকাশ

38

আপনার স্পষ্টকরণে বলা হয়েছে: "আমি এনামগুলি ব্যবহার করব না, আমি কিছু গণনা করছি না, কেবল কিছু ধ্রুবক সংগ্রহ করছি যা একে অপরের সাথে সম্পর্কিত নয়।"

যদি ধ্রুবকগুলি একে অপরের সাথে সম্পর্কিত না হয় তবে আপনি কেন তাদের একসাথে সংগ্রহ করতে চান? প্রতিটি ধ্রুবকটিকে ক্লাসে রাখুন যার সাথে এটি সবচেয়ে ঘনিষ্ঠভাবে সম্পর্কিত।


4
জন - এগুলি সেই অর্থে সম্পর্কিত যা তারা সকলেই একই কার্যকারিতার সাথে সম্পর্কিত। যাইহোক, তারা কোনও কিছুর একটি গণনা নয় ... তারা কোনও সম্পত্তি "those জিনিসগুলির মধ্যে একটি" হিসাবে সম্পত্তি রাখে না।
যুবাল আদম

13
ঠিক আছে. সেক্ষেত্রে কেবল তাদের ক্লাসে রাখুন যা তারা সম্পর্কিত কার্যকারিতার নিকটতম।
জন স্কিটি

28

আমার পরামর্শ (পছন্দের ক্রম হ্রাসে):

1) এটি করবেন না । প্রকৃত শ্রেণিতে ধ্রুবকগুলি তৈরি করুন যেখানে তারা সবচেয়ে প্রাসঙ্গিক। 'ব্যাগ অফ ধ্রুবক' শ্রেণি / ইন্টারফেস থাকা সত্যই ওও সেরা অনুশীলনগুলি অনুসরণ করে না।

আমি এবং অন্য প্রত্যেকে সময়ে সময়ে # 1 টি উপেক্ষা করি। আপনি যদি তা করতে যাচ্ছেন তবে:

২) প্রাইভেট কন্সট্রাক্টরের সাথে চূড়ান্ত শ্রেণি অন্তত সহজেই অ্যাক্সেস পেতে কনস্ট্যান্টগুলির প্রসারিত / প্রয়োগ করে আপনার 'ব্যাগ কনস্ট্যান্টদের' আপত্তিজনক ব্যবহার থেকে কাউকে প্রতিরোধ করবে। (আমি জানি আপনি বলেছেন যে আপনি এটি করবেন না - তবে এর অর্থ এই নয় যে আপনার সাথে আসার পরে কেউ আসছেন)

3) ইন্টারফেস এটি কাজ করবে, তবে আমার পছন্দটি # 2-তে সম্ভাব্য দুর্ব্যবহারের কথা উল্লেখ করে নয়।

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


4
1 এর সমস্যাটি হ'ল কখনও কখনও আপনি আপনার কোডটিতে ধ্রুবক আনার জন্য অন্য স্তরের শ্রেণির সাথে কিছু নির্ভরতা ইনজেকশান করেন।
আমদেব

একটি ইন্টারফেসের সমস্ত ক্ষেত্র সুস্পষ্টভাবে সর্বজনীন, স্থির এবং চূড়ান্ত
কোডেবেটার

@ কোডবেটার তবে আরও ক্ষেত্র যুক্ত করতে ইন্টারফেসগুলি বাড়ানো / প্রয়োগ করা যেতে পারে।
উইট

12

জোশুয়া ব্লচ কার্যকর জাভাতে নোট হিসাবে:

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

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

class SomeConstants
{
    // Prevents instanciation of myself and my subclasses
    private SomeConstants() {}

    public final static String TOTO = "toto";
    public final static Integer TEN = 10;
    //...
}

তারপরে, যেমন ইতিমধ্যে বলা হয়েছে, আপনি আপনার ধ্রুবকগুলি ব্যবহার করতে স্থির আমদানি ব্যবহার করতে পারেন।


7

আমার পছন্দের পদ্ধতিটি মোটেও তা করা নয়। যখন জাভা 5 টাইপসেফ এনমগুলি প্রবর্তন করেছিল তখন ধ্রুবকগুলির বয়স অনেকটা মারা যায়। এবং তারও আগে জোশ ব্লচ তার একটি (কিছুটা আরও শব্দযুক্ত) সংস্করণ প্রকাশ করেছিলেন যা জাভা ১.৪ (এবং এর আগে) তে কাজ করেছিল।

আপনার যদি কিছু লিগ্যাসি কোডের সাথে আন্তঃক্ষেত্রের প্রয়োজন না হয় তবে স্ট্রিং / ইন্টিজার কনস্ট্যান্ট নামের আর কোনও কারণ নেই really


4
ভাল উত্তর, একটি উদাহরণ ভাল হবে।
আমদেব

3

শুধু চূড়ান্ত ক্লাস ব্যবহার করুন।

আপনি যদি অন্য মান যুক্ত করতে সক্ষম হন তবে একটি বিমূর্ত শ্রেণি ব্যবহার করুন।

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



3

enumগুলি ঠিক আছে। আইআইআরসি, কার্যকর জাভাতে একটি আইটেম (২ য় এড) এর enumএকটি [জাভা কীওয়ার্ড] প্রয়োগকারী মানক বিকল্পগুলি গণনা করার ধ্রুবক রয়েছেinterface কোনও মানের জন্য ।

আমার পক্ষপাত একটি [জাভা শব্দ] ব্যবহার হয় interfaceএকটি ওভার final classধ্রুবক জন্য। আপনি স্পষ্টতই পাবেন public static final। কিছু লোক তর্ক করবে যে কোনও একটি interfaceখারাপ প্রোগ্রামাররা এটি প্রয়োগ করতে দেয় তবে খারাপ প্রোগ্রামাররা কোড লিখতে চলেছে যা আপনি যা করেন তা বিবেচনা করে না।

কোনটি আরও ভাল দেখাচ্ছে?

public final class SomeStuff {
     private SomeStuff() {
         throw new Error();
     }
     public static final String SOME_CONST = "Some value or another, I don't know.";
}

বা:

public interface SomeStuff {
     String SOME_CONST = "Some value or another, I don't know.";
}

তবে খারাপ প্রোগ্রামাররা কোড লিখতে চলেছে যা আপনি যা করেন তা বিবেচনা করে না। এটা ঠিক তাই সত্য। আপনি যদি খারাপ প্রোগ্রামিং প্রশমিত করতে বা এটি পুরোপুরি দূর করতে পদক্ষেপ নিতে পারেন তবে তা করার জন্য আপনার কিছুটা দায়বদ্ধতা রয়েছে; যতটা সম্ভব স্পষ্ট হতে। একটি খারাপ প্রোগ্রামার একটি চূড়ান্ত শ্রেণি প্রসারিত করতে পারে না।
liltitus27

4
@ liltitus27 কিছুটা হলেও আমি সম্মত। তবে আপনি কি চান না আপনি কেবল অগলিত কোডটি চান খারাপ কোড লেখার দরিদ্র প্রোগ্রামারদের একটি উপায় বন্ধ করতে? তাদের উত্পাদিত কোডটি এখনও নিরাশ হবে, তবে এখন আপনার কোডটি কম পঠনযোগ্য।
টম হাটিন -

1

অথবা ৪. এগুলি ক্লাসে রাখুন যাতে যুক্তি রয়েছে যা ধ্রুবকগুলি সবচেয়ে বেশি ব্যবহার করে

... দুঃখিত, প্রতিরোধ করতে পারেনি ;-)


4
এটি একটি ভাল ধারণা নয়। এটি শ্রেণীর মধ্যে নির্ভরতা তৈরি করে যার কোনটিই হওয়া উচিত নয়।
যুবাল আদম

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

ধ্রুবকগুলি ব্যবহার করে যদি কেবল একটি শ্রেণি থাকত তবে এটি উপলব্ধি হতে পারে।
টম হাটিন -

-1
  1. বেসরকারী নির্মাণকারীর একটি অসুবিধা হ'ল পদ্ধতির উপস্থিতি কখনও পরীক্ষা করা যায়নি।

  2. নির্দিষ্ট ডোমেন টাইপের ক্ষেত্রে প্রকৃতির ধারণাটি প্রয়োগ করা ভাল, বিকেন্দ্রীভূত ধ্রুবকগুলিতে এটি প্রয়োগ করুন যথেষ্ট ভাল দেখাচ্ছে না looks

এনুমের ধারণাটি হল "এনুমারেশনগুলি নিবিড়ভাবে সম্পর্কিত আইটেমগুলির সেট"।

  1. একটি ধ্রুবক ইন্টারফেস প্রসারিত / বাস্তবায়ন করা একটি খারাপ অভ্যাস, এটি সরাসরি উল্লেখ না করে অপরিবর্তনীয় ধ্রুবক বাড়ানোর প্রয়োজনীয়তা সম্পর্কে চিন্তা করা শক্ত।

  2. যদি সোনারসোর্সের মতো মানের সরঞ্জাম প্রয়োগ করা হয় তবে নিয়ম বিকাশকারীকে ধ্রুবক ইন্টারফেসটি ফেলে দিতে বাধ্য করা হয়, এটি একটি উদ্ভট বিষয় কারণ প্রচুর প্রকল্পগুলি ধ্রুবক ইন্টারফেস উপভোগ করে এবং ধ্রুবক ইন্টারফেসগুলিতে "প্রসারিত" জিনিসগুলি খুব কমই ঘটে তা দেখতে খুব কমই দেখা যায়


4
"ব্যক্তিগত নির্মাণকারী হ'ল পদ্ধতির অস্তিত্ব কখনই পরীক্ষা করা যায় না": সত্য নয়। যদি আপনি (বা আপনার বস) কোড কভারেজের প্রতিবেদনগুলি 100% হওয়ার বিষয়ে সত্যিই ভৌতিক হয়ে থাকেন তবে আপনি প্রতিচ্ছবিটি ব্যবহার করে এবং নির্মাতাকে ব্যতিক্রম ছুঁড়ে নিশ্চিত করে এটি পরীক্ষা করতে পারেন। তবে, আইএমএইচও, এটি কেবল আনুষ্ঠানিকতা এবং সত্যই এটি পরীক্ষা করার দরকার নেই। যদি আপনি (বা দল) কেবল সত্যই গুরুত্বপূর্ণ যা যত্নশীল হয়, 100% লাইন কভারেজ প্রয়োজন হয় না।
এল। হল্যান্ডা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.