জাভার বুলিয়ান ক্লাস - এনাম নয় কেন?


11

আমার কাছে মনে হয় যে বুলিয়ান ক্লাসটি এনাম হিসাবে বাস্তবায়নের জন্য আদর্শ প্রার্থী।

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

public final class Boolean implements java.io.Serializable,
                                      Comparable<Boolean>
{
   public static final Boolean TRUE = new Boolean(true);
  public static final Boolean FALSE = new Boolean(false);
   private final boolean value;
   public Boolean(boolean value) {
       this.value = value;
   }
   public Boolean(String s) {
       this(toBoolean(s));
   }
   public boolean booleanValue() {
       return value;
   }
   public String toString() {
       return value ? "true" : "false";
   }
   public int hashCode() {
       return value ? 1231 : 1237;
   }
   public boolean equals(Object obj) {
       if (obj instanceof Boolean) {
           return value == ((Boolean)obj).booleanValue();
       }
       return false;
   }
   public int compareTo(Boolean b) {
       return compare(this.value, b.value);
   }
}

একটি এনাম সংস্করণ সহ:

public enum Boolean implements Comparable<Boolean>
{
   FALSE(false), TRUE(true);
   private Boolean(boolean value) {
       this.value = value;
   }
   private final boolean value;
   public boolean booleanValue() {
       return value;
   }

   public String toString() {
       return value ? "true" : "false";
   }
}

বুলিয়ান এনাম হয়ে উঠতে পারার কোন কারণ নেই?

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

   public boolean equals(Object obj) {

       if (this == obj) {
          return true;
       }

       if (obj instanceof Boolean) {
           return value == ((Boolean)obj).booleanValue();
       }
       return false;
   }

4
আপনি কি বুলিনের জন্য অন্য কোনও মান আশা করছেন যা সত্য বা মিথ্যা নয়?

1
@ মিশেলটি একটি এনামের 2 টির বেশি মান হওয়া দরকার না। এটি জাভাতে এক ধরণের অর্থহীন হতে চাই কারণ এটি বুলেঁসগুলির প্রসেসিংয়ের জন্য বিশেষায়িত বিবৃতি রয়েছে ( if) তবে ধারণাবাদী / ধরণের তত্ত্বের দিক থেকে বুলিয়ান এবং এনামগুলি উভয়ই সমষ্টিগুলির উদাহরণ, সুতরাং আমি মনে করি তারা কেন করেন নি তা জিজ্ঞাসা করা ন্যায়সঙ্গত তাদের মধ্যে ব্যবধান পূরণ করতে পারব না।
ডোভাল

1
দ্রষ্টব্য: আপনিও valueOf(String)(যা এনামের মান ওফের সাথে সাংঘর্ষিক হতে পারে) বাস্তবায়ন এবং যে জাদুটিকে getBooleanএটিকে তৈরি করতে পারে তা বাস্তবায়নের হাতছাড়া করেছেন বলে মনে হয় যাতে Boolean.valueOf("yes")মিথ্যা পরিবর্তে সত্যে ফিরে আসে। উভয়ই 1.0 টি অনুচ্ছেদের অংশ এবং উপযুক্ত পিছনের সামঞ্জস্যের প্রয়োজন হবে।

8
@MichaelT FileNotFound অবশ্যই!
ডোনাল ফেলো

উত্তর:


13

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

বলা হচ্ছে, জাভা রিলিজগুলির মধ্যে পিছনে সামঞ্জস্য রাখার খ্যাতি অর্জন করেছে, তাই আমরা যদি আজ, আপনার সমাধানটিকে একটি ভাল বিকল্প হিসাবে বিবেচনা করতে পারি তবে আমরা ইতিমধ্যে পুরানো বুলিয়ান ব্যবহার করে হাজার হাজার কোডের লাইন না ভেঙে এটি করতে পারি না বর্গ।


3
আপনি জাভা.এল.আং.বুলিয়ানের জন্য জাভা ০.০ ভাষা বৈশিষ্টটি খুঁজে পেতে পারেন help new Boolean("True")এবং new Boolean("true")এছাড়াও প্রকল্পিত enum বাস্তবায়ন কিছু সমস্যা হতে পারে।

একাধিক (অপরিবর্তনীয়) অবজেক্টগুলিকে মঞ্জুরি দেওয়া ভুল বলে মনে হয় এবং তাই বুলিয়ানতে প্রদত্ত কনস্ট্রাক্টর ব্যবহার করা ভাল ধারণা নয় - যেমন এপিআই ডকুমেন্টেশন বলে।
হাইল্যান্ড মার্ক

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

13

এমন কিছু জিনিস রয়েছে যা কার্যকর হয় না এবং আপনি জাভা বুলিয়ানটির পূর্ববর্তী কার্যকারিতার সাথে তুলনা করার সময় বিস্ময়কর উপায়ে কাজ করবেন না।

আমরা বক্সিংটিকে উপেক্ষা করব কারণ এটি 1.5 এর সাথে কিছু যুক্ত হয়েছিল। হাইপোথিটিক্যালি, সান চাইলে তারা enum Booleanঠিক তেমন পারফরম্যান্স করা বক্সিংয়ের মতো আচরণ করতে পারত class Boolean

তবুও, অন্যান্য চমকপ্রদ (কোডারের কাছে) উপায় রয়েছে যা পূর্ববর্তী শ্রেণীর কার্যকারিতার তুলনায় হঠাৎ করে এটি ভেঙে যায়।

মান মান (স্ট্রিং) সমস্যা

এর একটি সাধারণ উদাহরণ হ'ল:

public class BooleanStuff {
    public static void main(String args[]) {
        Boolean foo = Boolean.valueOf("TRUE");
        System.out.println(foo);
        foo = Boolean.valueOf("TrUe");
        System.out.println(foo);
        foo = Boolean.valueOf("yes");  // this is actually false
        System.out.println(foo);

        // Above this line is perfectly acceptable Java 1.3
        // Below this line takes Java 1.5 or later

        MyBoolean bar;
        bar = MyBoolean.valueOf("FALSE");
        System.out.println(bar);
        bar = MyBoolean.valueOf("FaLsE");
        System.out.println(bar);
    }

    enum MyBoolean implements Comparable<MyBoolean> {
        FALSE(false), TRUE(true);
        private MyBoolean(boolean value) { this.value = value; }
        private final boolean value;
        public boolean booleanValue() { return value; }
        public String toString() { return value ? "true" : "false"; }
    }
}

এই কোড রান দেয়:

সত্য
সত্য
মিথ্যা
মিথ্যা
থ্রেড "মেইন" জাভা.এলং.এই অবৈধআর্গুমেন্টএক্সেপশন ব্যতিক্রম: কোনও এনাম ধ্রুবক বুলিয়ান স্টাফ.মাইবুলিয়ান .এফএলএসই
    java.lang.Enum.valueOf এ (এনাম.জভা ২৩66)
    বুলিয়ানস্টফ-মাইবুলিয়ান.ভালিউঅফ (বুলিয়ানস্টফ.জভা ১:17)
    বুলিয়ানস্টফ.মেনে (বুলিয়ানস্টফ.জভা ১৩)

এখানে সমস্যা যে আমি মাধ্যমে কিছু নয় পাস না পারে TRUEবা FALSEকরতে valueOf(String)

ঠিক আছে ... আমরা আমাদের নিজস্ব পদ্ধতিতে এটি ওভাররাইড করব ...

    public static MyBoolean valueOf(String arg) {
        return arg.equalsIgnoreCase("true") ? TRUE : FALSE;
    }

তবে ... এখানে একটি সমস্যা আছে। আপনি একটি স্থিতিশীল পদ্ধতি ওভাররাইড করতে পারবেন না

এবং তাই, সমস্ত কোড যা চারপাশে trueবা Trueঅন্য কোনও মিশ্রিত মিশ্রণটি ত্রুটিযুক্ত হয়ে যাবে - এবং একটি রানটাইম ব্যতিক্রম সহ বেশ দর্শনীয়ভাবে।

মান সহ আরও কিছু মজা

আরও কিছু বিট রয়েছে যা খুব ভাল কাজ করে না:

public static void main(String args[]) {
    Boolean foo = Boolean.valueOf(Boolean.valueOf("TRUE"));
    System.out.println(foo);

    MyBoolean bar = MyBoolean.valueOf(MyBoolean.valueOf("FALSE"));
    System.out.println(bar);
}

জন্য foo, আমি ইতিমধ্যে একটি বক্সযুক্ত মান বক্সিং সম্পর্কে একটি সতর্কতা পেতে। তবে বারের কোডটি একটি সিনট্যাক্স ত্রুটি:

ত্রুটি: (,, ২৪) জাভা: মানের জন্য উপযুক্ত কোনও পদ্ধতি খুঁজে পাওয়া যায় নি (বুলিয়ানস্টফ.মাইবুলিয়ান)
    বুলিয়ান স্টাফ.মাইবুলিয়ান.ভালিউওফ (জাভা.লাং.স্ট্রিং) প্রযোজ্য নয়
      (আসল যুক্তি বুলিয়ানস্টফ.মাইবুলিয়ান java.lang. স্ট্রিং পদ্ধতিতে অনুরোধ রূপান্তর দ্বারা রূপান্তর করা যাবে না)
    পদ্ধতি java.lang.Enum.valueOf (java.lang.Class, java.lang.String) প্রযোজ্য নয়
      (আর্গুমেন্টগুলি থেকে ইনস্ট্যান্ট করতে পারে না কারণ আসল এবং আনুষ্ঠানিক যুক্তির তালিকাগুলি দৈর্ঘ্যে পৃথক হয়)

যদি আমরা সেই সিনট্যাক্স ত্রুটিটিকে আবার কোনও Stringপ্রকারে জোর করি :

public static void main(String args[]) {
    Boolean foo = Boolean.valueOf(Boolean.valueOf("TRUE"));
    System.out.println(foo);

    MyBoolean bar = MyBoolean.valueOf(MyBoolean.valueOf("FALSE").toString());
    System.out.println(bar);
}

আমরা আমাদের রানটাইম ত্রুটি ফিরে পেয়েছি:

সত্য
থ্রেড "মেইন" জাভা.এলং.এই অবৈধ অরগমেন্ট এক্সেপশন ব্যতিক্রম: কোনও এনাম ধ্রুব বুলিয়ান স্টাফ.মাইবুলিয়ান.ফালস
    java.lang.Enum.valueOf এ (এনাম.জভা ২৩66)
    বুলিয়ানস্টফ-মাইবুলিয়ান.ভালিউঅফ (বুলিয়ানস্টফ.জভা ১১)
    বুলিয়ানস্টফ.মেনে (বুলিয়ানস্টফ.জভা:))

কেন যে কেউ লিখতে হবে? ডুনো ... তবে এর কোড যা কাজ করে এবং এখন আর কাজ করে না।


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

if(boolValue == new Boolean("true")) { ... }

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

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


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

একটি ofবা fromপদ্ধতি এবং উপযুক্ত জাভাদোক যুক্ত করা খুব কঠিন হত না ।
assylias

@ জাফলিয়া অন্যান্য জাভা কোডের বেশিরভাগ কনভেনশনটি হলেন valueOfএবং বুলিয়ান.ভালিউওফ () 1.0 এর পরে থেকে এসেছেন । হয় এনামগুলি স্ট্যাটিক পদ্ধতি হিসাবে মান মান ব্যবহার করতে সক্ষম হবে না, বা বুলিয়ান যেটি ব্যবহার করছে তার থেকে আলাদা পদ্ধতি প্রয়োজন। পারেন বিরতি কনভেনশন বা সামঞ্জস্য করছেন - এবং না থাকার বুলিয়ান হতে একটি enum বিরতি তন্ন তন্ন। এটি থেকে পছন্দটি মোটামুটি সহজ।

"তবে ... এখানে একটি সমস্যা আছে You আপনি একটি স্ট্যাটিক পদ্ধতি ওভাররাইড করতে পারবেন না।" আপনি কোনও কিছুকেই "ওভাররাইডিং" করছেন না - পদ্ধতিটি যাইহোক কোনও সুপারক্লাসে বিদ্যমান নেই। পরিবর্তে সমস্যাটি হ'ল পদ্ধতিটি সমস্ত এনামগুলির জন্য স্বয়ংক্রিয়ভাবে সংজ্ঞায়িত হয় এবং আপনি এটি পুনরায় সংজ্ঞা দিতে পারবেন না।
ব্যবহারকারী 102008

"ফু জন্য, আমি ইতিমধ্যে একটি বাক্সযুক্ত মান বক্সিং করার বিষয়ে একটি সতর্কতা পেয়েছি However তবে, বারের কোডটি একটি সিনট্যাক্স ত্রুটি:" এটি একটি ভুল তুলনা। ইন Boolean.valueOf(Boolean.valueOf("TRUE")), দুটি পৃথক valueOf পদ্ধতি আছে: valueOf(String)এবং valueOf(boolean)। বাক্যগঠন ত্রুটি কারণ আপনি বাস্তবায়ন করতে ভুলে গেছি valueOf(boolean)মধ্যে MyBoolean। তারপরে দুটি কলের মধ্যে স্বতঃবক্সিং রয়েছে, যা ভাষায় হার্ডকোড করা হয়েছে Booleanতবে তা নয়। MyBooleanআপনি যদি valueOf(boolean) MyBoolean.valueOf(MyBoolean.valueOf("FALSE").booleanValue())কাজগুলি প্রয়োগ করেন
ব্যবহারকারী 102008

2

সম্ভবত সম্ভবত আদিম booleanধরণটি একটি নয় এবং আদিম ধরণের Enumবাক্সযুক্ত সংস্করণগুলি তাদের আনবক্সড সংস্করণে প্রায় একই রকম আচরণ করে। যেমন

Integer x = 5;
Integer y = 7;
Integer z = x + y;

(পারফরম্যান্স একই নাও হতে পারে, তবে এটি ভিন্ন বিষয়))

আপনি যদি লিখতে পারতেন তবে এটি এক ধরনের আশ্চর্যজনক বিষয় হবে:

Boolean b = Boolean.TRUE;
switch (b) {
case Boolean.TRUE:
    // do things
    break;
case Boolean.FALSE:
    // do things
    break;
}

কিন্তু না:

boolean b = true;
switch(b) {
case true:
    // do things
    break;
case false:
    // do things
    break;
}  

1
আপনি যদি বিবৃতিটি প্রদর্শন করতে চান তবে এটি কোনও এনামের সাথে কাজ করে না।

@ মিশেলটি আমি কল্পনা করেছি যে সংকলকটি এখনও এটি আনবক্স করতে সক্ষম হবে এবং ifবর্তমানে যেমন কাজ করে ঠিক তেমন কাজটি করতে পারে। অন্যদিকে আপনি Booleanযে অতিরিক্ত কার্যকারিতা যুক্ত করেননি তা এড়িয়ে যাওয়ার কোনও উপায় booleanনেই।
ডোভাল

ওহো ... আপনি জাভায় বুলেঁসের জন্য সুইচ স্টেটমেন্ট লিখতে পারবেন না? এটা পাগলামি.
টমাস এডিং

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

@ হাইল্যান্ডমার্ক এটি সত্য, তবে আমার বক্তব্যটি হ'ল তারা মুখ্য কষ্ট সহ্য করেছেন যে বক্স বক্সগুলি তাদের আদিম অংশগুলির মতো একই উপায়ে ব্যবহারযোগ্য p আনবক্সিং এমন একটি জিনিস যা তাদের প্রয়োগ করতে হয়েছিল, এটি নিখরচায় আসে না।
ডোভাল

0

valueOfইস্যু ছাড়াও (যা জাভা স্তরের একটি ইস্যু, এটি জেভিএম স্তরের উপর কাজ করতে পারে), কারণ এটিতে Booleanপাবলিক কনস্ট্রাক্টর রয়েছে। এটি একটি খারাপ ধারণা ছিল, বর্তমানে হ্রাস করা হয়েছে, তবে এটি এখানে থাকার জন্য রয়েছে।


0

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

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

সুতরাং বুল সুইফট ভাষার অংশ নয়, তবে স্ট্যান্ডার্ড লাইব্রেরির অংশ। সত্য এবং মিথ্যা ভাষার অংশ, এবং এক্সপ্রেসিবলবাইবুলিয়ানলিটাল প্রোটোকল।

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