আমি জাভাতে এনাম শুরু মান সেট করতে পারি?


194

আমি এনাম ব্যবহার করে কয়েকটি ধ্রুবক তৈরি করেছি:

enum ids {OPEN, CLOSE};

ওপেনের মানটি শূন্য, তবে আমি এটি 100 হিসাবে চাই it এটি কি সম্ভব?


@ স্কটএফ আপনি কি এনাম ব্যবহার করতে চান?
আনিস বি

শীর্ষ উত্তরে, একটি এনাম সংজ্ঞা রয়েছে। আমি সংজ্ঞায়িত এনাম কোডটিতে কীভাবে ব্যবহৃত হবে তার একটি উদাহরণ চাই। উদাহরণস্বরূপ, নির্দিষ্ট সংখ্যার মান সহ এনাম উদাহরণ তৈরি করতে সংজ্ঞায়িত কর্টর কীভাবে ব্যবহৃত হবে।
স্কটএফ

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

enum ids {OPEN = 100, CLOSE};?
মিঃ অস্কার

উত্তর:


307

জাভা এনামগুলি সি বা সি ++ এনমগুলির মতো নয়, যা কেবল পূর্ণসংখ্যার জন্য কেবল লেবেল।

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

public enum Ids {
    OPEN(100), CLOSE(200);

    private final int id;
    Ids(int id) { this.id = id; }
    public int getValue() { return id; }
}

বড় পার্থক্যটি হ'ল এগুলি টাইপ-সেফ যার অর্থ আপনার একটি সাইজ ভেরিয়েবলের জন্য একটি রঙিন এনাম দেওয়ার বিষয়ে চিন্তা করার দরকার নেই।

আরও জানতে http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html দেখুন।


আপনার বক্তব্যের উপর ভিত্তি করে, জাভা ব্যবহার করে অনুক্রমিক পূর্ণসংখ্যার এনাম তৈরি করতে (সি ++ এনমের অনুরূপ) সেরা অনুশীলনটি লিখতে হবে: এনুম আইডিএস s NAME (0), এজিই (1) ), উচ্চতা (2), ওজন (3); } আপনাকে ধন্যবাদ, -বিএন
বিএন।

সম্ভবত, এবং বিশেষত যদি আপনি কখনও কোথাও অবিচ্ছেদ্য মানগুলিকে ক্রমিকায়িত করেন।
লভিনিও

1
আপনি একটি ফাংশন এই enum কিভাবে ব্যবহার করতে দয়া করে বলতে পারেন?
বাগগুলি

2
এনামের জন্য কোনও মান সেট করার অনুমতি না দেওয়া জাভা স্ট্যান্ডার্ডের পক্ষে অলস। কমপক্ষে সি # এই এবং এটিকে টাইপ-সেফ করতে দেয়।
csmith

2
FWIW, C ++ 11 এখন টাইপ-সেফ রয়েছে enum class
ফিনিক্স

92

হ্যাঁ. আপনি এনামের জন্য কনস্ট্রাক্টরের সংখ্যাসূচক মানগুলি যেমন পাস করতে পারেন:

enum Ids {
  OPEN(100),
  CLOSE(200);

  private int value;    

  private Ids(int value) {
    this.value = value;
  }

  public int getValue() {
    return value;
  }
}

দেখুন সূর্যের জাভা ভাষা গাইড আরও তথ্যের জন্য।


কুল। মেশানো কি সম্ভব? অর্থাৎ নির্বাচিত এনাম মানগুলিতে কেবল সংখ্যা নির্ধারণ করুন।
ফ্রেডরিক নর্ড

প্রাইভেট মডিফায়ার এনাম কনস্ট্রাক্টরদের জন্য অপ্রয়োজনীয়
নিনো ভ্যান হুফ

@ ফ্রেডেরিকনর্ড - অবশ্যই কোনও আরগ নেই এমন একটি দ্বিতীয় বেসরকারী নির্মাতা যুক্ত করুন যা valueএকটি (বলুন) শূন্যের সূচনা করে। তারপরে DANCEমানগুলির তালিকায় (বলুন) অন্তর্ভুক্ত করুন ।
স্টিফেন সি

15

এইভাবে ব্যবহার সম্পর্কে কি:

public enum HL_COLORS{
          YELLOW,
          ORANGE;

          public int getColorValue() {
              switch (this) {
            case YELLOW:
                return 0xffffff00;
            case ORANGE:
                return 0xffffa500;    
            default://YELLOW
                return 0xffffff00;
            }
          }
}

শুধুমাত্র একটি পদ্ধতি আছে ..

আপনি স্থিতিশীল পদ্ধতি ব্যবহার করতে পারেন এবং এনামকে প্যারামিটার হিসাবে পাস করতে পারেন:

public enum HL_COLORS{
          YELLOW,
          ORANGE;

          public static int getColorValue(HL_COLORS hl) {
              switch (hl) {
            case YELLOW:
                return 0xffffff00;
            case ORANGE:
                return 0xffffa500;    
            default://YELLOW
                return 0xffffff00;
            }
          }

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


1
getColorValue()দ্বিতীয় উদাহরণে কেন সিঙ্ক্রোনাইজ করা হয়?
জোসফাত্তভি

@ জোসাফাতভ দ্বিতীয় উদাহরণে সমস্ত কার্যকারিতা স্থির, এটি কখনই পরিবর্তিত হয় না। HL_COLORS.getColorValue(HL_COLORS.YELLOW);এনাম শুরু না করে আপনি চাইবেন ।
mazunki

11

আপনি যদি খুব বড় এনাম টাইপ ব্যবহার করেন তবে নিম্নলিখিতগুলি কার্যকর হতে পারে;

public enum deneme {

    UPDATE, UPDATE_FAILED;

    private static Map<Integer, deneme> ss = new TreeMap<Integer,deneme>();
    private static final int START_VALUE = 100;
    private int value;

    static {
        for(int i=0;i<values().length;i++)
        {
            values()[i].value = START_VALUE + i;
            ss.put(values()[i].value, values()[i]);
        }
    }

    public static deneme fromInt(int i) {
        return ss.get(i);
    }

    public int value() {
    return value;
    }
}

7

আপনি যদি সি / সি ++ (বেস নাম এবং নেেক্সট ইনক্রিমেন্টাল) এর এনাম অনুকরণ করতে চান:

enum ids {
    OPEN, CLOSE;
    //
    private static final int BASE_ORDINAL = 100;
    public int getCode() {
        return ordinal() + BASE_ORDINAL;
    }
};

public class TestEnum {
    public static void main (String... args){
        for (ids i : new ids[] { ids.OPEN, ids.CLOSE }) {
            System.out.println(i.toString() + " " + 
                i.ordinal() + " " + 
                i.getCode());
        }
    }
}
OPEN 0 100
CLOSE 1 101

4

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

উদাহরণ:

public class TestEnum {
    enum ids {
        OPEN,
        CLOSE,
        OTHER;

        public final int value = 100 + ordinal();
    };

    public static void main(String arg[]) {
        System.out.println("OPEN:  " + ids.OPEN.value);
        System.out.println("CLOSE: " + ids.CLOSE.value);
        System.out.println("OTHER: " + ids.OTHER.value);
    }
};

আউটপুট দেয়:

OPEN:  100
CLOSE: 101
OTHER: 102

সম্পাদনা: ঠিক বুঝতে পেরেছি এটি গ্রেগ্রান্ডের জবাবের সাথে খুব মিল , তবে আমি এটি এখানে রেখে দেব কারণ এটি খুব পরিষ্কার এবং আপনি সি স্টাইলের এনামে যেতে পারার কাছাকাছি।


উদাহরণস্বরূপ আপনি একটি এনাম নেন এবং একটি int পান। আপনি কি বিপরীতটি দেখাতে পারেন, একটি এনট নেওয়ার সাথে শেষ করতে পারেন (প্রতিটি মানের জন্য সুস্পষ্ট সুইচ কেস ছাড়াই?)
স্কটএফ

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

@ রাহুলজাইন আমি বরং স্বীকৃত উত্তরটি ব্যবহার করব। এটা আমার কাছে পরিষ্কার মনে হচ্ছে।
লেসেল্ডেওরো

1

@scottf

একটি এনাম সিঙ্গলটনের মতো। জেভিএম উদাহরণ তৈরি করে।

আপনি যদি নিজের দ্বারা এটি ক্লাসগুলির সাথে তৈরি করেন তবে এটি দেখতে এমন হতে পারে

public static class MyEnum {

    final public static MyEnum ONE;
    final public static MyEnum TWO;

    static {
        ONE = new MyEnum("1");
        TWO = new MyEnum("2");
    }

    final String enumValue;

    private MyEnum(String value){
        enumValue = value;    
    }

    @Override
    public String toString(){
        return enumValue;
    }


}

এবং এটি ব্যবহার করা যেতে পারে:

public class HelloWorld{

   public static class MyEnum {

       final public static MyEnum ONE;
       final public static MyEnum TWO;

       static {
          ONE = new MyEnum("1");
          TWO = new MyEnum("2");
       }

       final String enumValue;

       private MyEnum(String value){
           enumValue = value;    
       }

       @Override
       public String toString(){
           return enumValue;
       }


   }

    public static void main(String []args){

       System.out.println(MyEnum.ONE);
       System.out.println(MyEnum.TWO);

       System.out.println(MyEnum.ONE == MyEnum.ONE);

       System.out.println("Hello World");
    }
}

0
 public class MyClass {
    public static void main(String args[]) {
     Ids id1 = Ids.OPEN;
     System.out.println(id1.getValue());
    }
}

enum Ids {
    OPEN(100), CLOSE(200);

    private final int id;
    Ids(int id) { this.id = id; }
    public int getValue() { return id; }
}

@ স্কটফ, ENUM এ সংজ্ঞায়িত কনস্ট্রাক্টরের কারণে আপনি সম্ভবত বিভ্রান্ত হয়েছেন।

আমাকে এটি ব্যাখ্যা করুন।

যখন class loaderলোড enumবর্গ, তারপর enumকন্সট্রাকটর নামেও। কিসে!! হ্যাঁ, এটি ডাকা হয়েছে OPENএবং close। কি 100জন্য OPENএবং 200জন্য মানclose

আমার কি আলাদা মূল্য থাকতে পারে?

হ্যাঁ,

public class MyClass {
    public static void main(String args[]) {
     Ids id1 = Ids.OPEN;
     id1.setValue(2);
     System.out.println(id1.getValue());
    }
}

enum Ids {
    OPEN(100), CLOSE(200);

    private int id;
    Ids(int id) { this.id = id; }
    public int getValue() { return id; }
    public void setValue(int value) { id = value; }
}

তবে, এটি খারাপ অভ্যাস। enumপ্রতিনিধিত্বমূলক জন্য ব্যবহার করা হয় constantsমত days of week, colors in rainbowপূর্বনির্ধারিত ধ্রুবক অর্থাৎ এত ছোট গ্রুপ।


0

আমি মনে করি আপনি সি ++ গণনার দিকে তাকিয়ে বিভ্রান্ত হয়েছেন। জাভা গণক পৃথক।

আপনি যদি সি / সি ++ এনামগুলিতে অভ্যস্ত হন তবে এই কোডটি হবে:

public class TestEnum {
enum ids {
    OPEN,
    CLOSE,
    OTHER;

    public final int value = 100 + ordinal();
};

public static void main(String arg[]) {
    System.out.println("OPEN:  " + ids.OPEN.value);
    System.out.println("CLOSE: " + ids.CLOSE.value);
    System.out.println("OTHER: " + ids.OTHER.value);
}
};
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.