'ধ্রুবক' ভাগ করে নেওয়ার জন্য জাভাতে স্থির ক্ষেত্রগুলির সাথে ইন্টারফেস


116

আমি জাভাতে andোকার জন্য কয়েকটি ওপেন সোর্স জাভা প্রজেক্টের দিকে তাকিয়ে দেখছি এবং তাদের অনেকেরই কিছু ধরণের 'ধ্রুবক' ইন্টারফেস রয়েছে।

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

আমি কিছু ধরণের সিডো 'গ্লোবাল ভেরিয়েবল' এর অনুমতি দেওয়ার জন্য ইন্টারফেস ব্যবহার করা অদ্ভুত বলে মনে করি।

public interface PConstants {

  // LOTS OF static fields...

  static public final int SHINE = 31;

  // emissive (by default kept black)
  static public final int ER = 32;
  static public final int EG = 33;
  static public final int EB = 34;

  // has this vertex been lit yet
  static public final int BEEN_LIT = 35;

  static public final int VERTEX_FIELD_COUNT = 36;


  // renderers known to processing.core

  static final String P2D    = "processing.core.PGraphics2D";
  static final String P3D    = "processing.core.PGraphics3D";
  static final String JAVA2D = "processing.core.PGraphicsJava2D";
  static final String OPENGL = "processing.opengl.PGraphicsOpenGL";
  static final String PDF    = "processing.pdf.PGraphicsPDF";
  static final String DXF    = "processing.dxf.RawDXF";


  // platform IDs for PApplet.platform

  static final int OTHER   = 0;
  static final int WINDOWS = 1;
  static final int MACOSX  = 2;
  static final int LINUX   = 3;

  static final String[] platformNames = {
    "other", "windows", "macosx", "linux"
  };

  // and on and on

}

15
দ্রষ্টব্য: static finalপ্রয়োজনীয় নয়, এটি একটি ইন্টারফেসের জন্য অপ্রয়োজনীয়।
থমাসডাব্লু

এছাড়াও মনে রাখবেন platformNamesহতে পারে public, staticএবং final, কিন্তু এটা স্পষ্টভাবে একটি ধ্রুবক নয়। একমাত্র ধ্রুবক অ্যারে হ'ল শূন্য দৈর্ঘ্য with
ভ্ল্যাক

@ থমাসডব্লু আমি জানি এটি কয়েক বছরের পুরনো, তবে আপনার মন্তব্যে আমার একটি ত্রুটি উল্লেখ করা দরকার। static finalঅযথা অপ্রয়োজনীয় হয় না। ক্লাস বা ইন্টারফেস ক্ষেত্রটি কেবল finalকীওয়ার্ড সহ সেই ক্ষেত্রের পৃথক দৃষ্টান্ত তৈরি করবে আপনি শ্রেণি বা ইন্টারফেসের অবজেক্ট তৈরি করার সময়। ব্যবহার static finalপ্রতিটি বস্তুকে সেই ক্ষেত্রের জন্য একটি মেমরি অবস্থান ভাগ করে তুলবে। অন্য কথায়, যদি কোনও ক্লাস মাইক্লাসের ক্ষেত্র final String str = "Hello";থাকে তবে মাইক্লাসের এন উদাহরণগুলির জন্য, মেমরির ক্ষেত্রে ক্ষেত্রের এন উদাহরণগুলি থাকতে পারে। staticকীওয়ার্ডটি যুক্ত করার ফলে কেবলমাত্র 1 টি ফলাফল ঘটবে।
সিন্ট্রিয়াস

উত্তর:


160

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

তবে এটির জন্য কেবল আমার কথাটি গ্রহণ করবেন না, জোশ ব্লচও বলেছেন এটি খারাপ:

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

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


8
এনামগুলি এখানে একটি লাল উত্তেজনা - বা কমপক্ষে একটি পৃথক প্রশ্ন। এনাম অবশ্যই ব্যবহার করা উচিত, তবে বাস্তবায়নকারীদের প্রয়োজন না হলে সেগুলিও লুকিয়ে রাখা উচিত।
ডিজেক্লেওয়ার্থ

12
বিটিডাব্লু: আপনি ক্লাস হিসাবে কোনও উদাহরণ নেই এমন এনাম ব্যবহার করতে পারেন যা তাত্ক্ষণিকভাবে চালু করা যায় না। ;)
পিটার লরি

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

2
@ ড্যানডায়ার হ্যাঁ, তবে একটি ইন্টারফেস কিছু ঘোষণা জড়িত করে। পাবলিক স্ট্যাটিক ফাইনালের মতো কেবল একটি ডিফল্ট। ক্লাস নিয়ে বিরক্তি কেন? এনাম - ভাল, এটি নির্ভর করে। একটি এনামের সত্তার জন্য সম্ভাব্য মানগুলির সংজ্ঞা নির্ধারণ করা উচিত, বিভিন্ন সত্তার জন্য মূল্য সংকলন নয়।
shadox

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

99

জাভা 1.5++ এ "কনস্ট্যান্ট ইন্টারফেস" প্রয়োগের পরিবর্তে, আপনি অন্য শ্রেণি / ইন্টারফেস থেকে স্থির / স্থির পদ্ধতি আমদানিতে স্থিতিশীল আমদানি ব্যবহার করতে পারেন:

import static com.kittens.kittenpolisher.KittenConstants.*;

এটি আপনার ক্লাসগুলির কোনও কার্যকারিতা নেই এমন ইন্টারফেসগুলি বাস্তবায়িত করার কদর্যতা এড়ায়।

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

তবে ইন্টারফেস ব্যবহারের পরিবর্তে, একটি বেসরকারী নির্মাণকারীর সাথে একটি চূড়ান্ত শ্রেণি ব্যবহার করুন। (ক্লাসটি ইনস্ট্যান্টিয়েট করা বা সাবক্লাস করা অসম্ভব করে তোলে, একটি শক্তিশালী বার্তা পাঠায় যে এতে অ স্থিতি কার্যকারিতা / ডেটা নেই))

উদাহরণ:

/** Set of constants needed for Kitten Polisher. */
public final class KittenConstants
{
    private KittenConstants() {}

    public static final String KITTEN_SOUND = "meow";
    public static final double KITTEN_CUTENESS_FACTOR = 1;
}

সুতরাং, আপনি ব্যাখ্যা করছেন যে, স্ট্যাটিক আমদানির কারণে আমাদের আগের মত একই ত্রুটি পুনরায় করার জন্য ইন্টারফেসের পরিবর্তে ক্লাস ব্যবহার করা উচিত ?! এটি বোকামি!
গ্যাজেট

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

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

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

2
গিজমো - আমি স্থিতিশীল আমদানির অনুরাগী নই, তবে তিনি সেখানে যা করছেন তা ক্লাসের নাম, অর্থাৎ কনস্টক্লাস.সোম_কনস্ট ব্যবহার করা এড়ানো হচ্ছে। স্থিতিশীল আমদানি করা আপনার সদস্যদের শ্রেণিতে এই সদস্যদের যুক্ত করে না the ইন্টারফেস থেকে উত্তরাধিকারী হওয়ার কথা বলে না, তিনি আসলে বিপরীতে বলেছেন।
mtruesdell

8

আমি ডানদিকে সঠিক হওয়ার ভান করি না, তবে এই ছোট উদাহরণটি দেখি:

public interface CarConstants {

      static final String ENGINE = "mechanical";
      static final String WHEEL  = "round";
      // ...

}

public interface ToyotaCar extends CarConstants //, ICar, ... {
      void produce();
}

public interface FordCar extends CarConstants //, ICar, ... {
      void produce();
}

// and this is implementation #1
public class CamryCar implements ToyotaCar {

      public void produce() {
           System.out.println("the engine is " + ENGINE );
           System.out.println("the wheel is " + WHEEL);
      }
}

// and this is implementation #2
public class MustangCar implements FordCar {

      public void produce() {
           System.out.println("the engine is " + ENGINE );
           System.out.println("the wheel is " + WHEEL);
      }
}

টয়োটাকার ফর্ডকার সম্পর্কে কিছুই জানে না, এবং টয়োটাকার সম্পর্কে ফোর্ডকারের কিছুই জানা নেই। নীতি CarConstants পরিবর্তন করা উচিত, কিন্তু ...

ধ্রুবকগুলি পরিবর্তন করা উচিত নয়, কারণ চাকাটি বৃত্তাকার এবং ইজাইন যান্ত্রিক, তবে ... ভবিষ্যতে টয়োটার গবেষণা প্রকৌশলীরা বৈদ্যুতিন ইঞ্জিন এবং ফ্ল্যাট চাকা আবিষ্কার করেছিলেন! আমাদের নতুন ইন্টারফেস দেখতে দিন

public interface InnovativeCarConstants {

          static final String ENGINE = "electronic";
          static final String WHEEL  = "flat";
          // ...
}

এবং এখন আমরা আমাদের বিমূর্তিটি পরিবর্তন করতে পারি:

public interface ToyotaCar extends CarConstants

প্রতি

public interface ToyotaCar extends InnovativeCarConstants 

এবং এখন যদি আমাদের কখনই ইঞ্জিন বা হুইল এর মূল মান পরিবর্তন করতে হয় তবে আমরা ট্যাওটাকার ইন্টারফেসটি অ্যাবস্ট্রাকশন স্তরে পরিবর্তন করতে পারি, বাস্তবায়নগুলি স্পর্শ করি না

এটি নিরাপদ নয়, আমি জানি, তবে আমি এখনও জানতে চাই যে আপনি এটি সম্পর্কে কী ভাবেন


আমি আপনাকে এখনই 2019 সালে ধারণাটি জানতে চাই me
বৃষ্টি

আমি আপনার ধারণার সাথে সম্পর্কিত একটি উত্তর লিখেছি: stackoverflow.com/a/55877115/5290519
বৃষ্টিপাত

এটি কীভাবে পিএমডির নিয়মগুলি খুব সীমাবদ্ধ তা একটি ভাল উদাহরণ। আমলাতন্ত্রের মাধ্যমে আরও ভাল কোড পাওয়ার চেষ্টা করা একটি ব্যর্থ প্রচেষ্টা attempt
বেবিবো

6

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

  1. ধারণাগুলি বিভিন্ন শ্রেণীর পাবলিক ইন্টারফেসের অংশ।

  2. ভবিষ্যতে প্রকাশে তাদের মানগুলি পরিবর্তিত হতে পারে।

  3. এটি সমালোচনা করে যে সমস্ত বাস্তবায়ন একই মান ব্যবহার করে।

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

সুতরাং আপনি স্থির ধ্রুবক দিয়ে একটি পাবলিক ইন্টারফেস লিখুন:

public interface SyntaxExtensions {
     // query type
     String NEAR_TO_QUERY = "nearTo";

     // params for query
     String POINT = "coordinate";
     String DISTANCE_KM = "distanceInKm";
}

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

পিএস: এই উদাহরণটির অনুপ্রেরণা নিও 4 জজ স্থানিক কোড থেকে আঁকা।


5

অন্ধত্বের সুবিধা দিয়ে আমরা দেখতে পাচ্ছি যে জাভা বিভিন্নভাবে ভেঙে গেছে। জাভাটির একটি বড় ব্যর্থতা হ'ল বিমূর্ত পদ্ধতি এবং স্থির চূড়ান্ত ক্ষেত্রগুলিতে ইন্টারফেসের সীমাবদ্ধতা। নতুন, আরও পরিশীলিত ওও ভাষাগুলির মতো স্কালার সাবস্কিট ইন্টারফেসগুলি বৈশিষ্ট্যের দ্বারা সাবমুট করতে পারে (যা সাধারণত করা হয়) কংক্রিট পদ্ধতিগুলি অন্তর্ভুক্ত করতে পারে, যার মধ্যে আরটি শূন্য থাকতে পারে (ধ্রুবক!)। যৌগিক আচরণের একক হিসাবে বৈশিষ্ট্যগুলির উপরে প্রকাশের জন্য, দেখুন http://scg.unibe.ch/archive/papers/Scha03aTraits.pdf । স্ক্যালায় বৈশিষ্ট্যগুলি জাভাতে ইন্টারফেসের সাথে কীভাবে তুলনা করা যায় তার একটি সংক্ষিপ্ত বিবরণের জন্য দেখুন http://www.codecommit.com/blog/scala/scala-for-java-refugees-part-5। ওও ডিজাইন শেখানোর প্রসঙ্গে, ইন্টারফেসগুলিতে কখনও স্থির ক্ষেত্রগুলি অন্তর্ভুক্ত করা উচিত নয় বলে জোর দেওয়ার মতো সরল নিয়মগুলি মূর্খ। অনেকগুলি বৈশিষ্ট্যে স্বাভাবিকভাবেই ধ্রুবকগুলি অন্তর্ভুক্ত থাকে এবং এই ধ্রুবকগুলি যথাযথভাবে বৈশিষ্ট্য দ্বারা সমর্থিত জনসাধারণের "ইন্টারফেস" এর অংশ are জাভা কোড লেখার ক্ষেত্রে, বৈশিষ্ট্য উপস্থাপনের জন্য কোনও পরিষ্কার, মার্জিত উপায় নেই তবে ইন্টারফেসের মধ্যে স্থির চূড়ান্ত ক্ষেত্রগুলি ব্যবহার করা বেশিরভাগ ক্ষেত্রে ভাল কাজের অংশ হয়।


12
মারাত্মক কৌতুকপূর্ণ এবং আজকাল পুরানো।
এস্কো

1
বিস্ময়কর অন্তর্দৃষ্টি (+1), যদিও জাভার বিরুদ্ধে কিছুটা সমালোচিত হতে পারে।
পিটার -

0

জেভিএম স্পেসিফিকেশন অনুসারে, একটি ইন্টারফেসের ক্ষেত্র এবং পদ্ধতিতে কেবল সর্বজনীন, স্ট্যাটিক, ফাইনাল এবং অ্যাবস্ট্রাক্ট থাকতে পারে। জাভা ভিএম এর অভ্যন্তরে রেফার করুন

ডিফল্টরূপে, ইন্টারফেসের সমস্ত পদ্ধতি বিমূর্ত হয় এমনকি আপনি এটি স্পষ্টভাবে উল্লেখ করেননি।

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


0

প্লেয়ারকে একটি মন্তব্য দেওয়ার মতো যথেষ্ট খ্যাতি আমার নেই, এর জন্য আমাকে একটি উত্তর তৈরি করতে হবে। এর জন্য আমি দুঃখিত, তবে তিনি এতে কিছুটা চেষ্টা করেছেন এবং আমি তার উত্তর দিতে চাই।

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

যদি কোনও ক্লায়েন্ট কেনার আগে গাড়িগুলির সাথে তুলনা করতে চান তবে তার কাছে এই জাতীয় পদ্ধতি থাকতে পারে:

public List<Decision> compareCars(List<I_Somecar> pCars);

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


-1

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

এটি এখনও বেশিরভাগ সময় পিছনে সামঞ্জস্যের জন্য ব্যবহার করা হয় বা প্রচুর প্রকল্পে মুক্তি পাওয়ার জন্য প্রয়োজনীয় পরিমাণ রিফ্যাক্টরিংয়ের কারণে ব্যবহৃত হয়।


2
জাভা 5 এর আগে, আপনি টাইপ-সেফ এনাম প্যাটার্নটি ব্যবহার করতে পারেন ( java.sun.com/developer/Books/shiftintojava/page1.html দেখুন )।
ড্যান ডায়ার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.