জাভা এনাম পদ্ধতিগুলি - এনামের বিপরীত দিকে ফিরে আসুন


113

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

কোডটি এখানে:

public enum Direction {

     NORTH(1),
     SOUTH(-1),
     EAST(-2),
     WEST(2);

     Direction(int code){
          this.code=code;
     }
     protected int code;
     public int getCode() {
           return this.code;
     }
     static Direction getOppositeDirection(Direction d){
           return new Direction(d.getCode() * -1);
     }
}

শুধু একটি সুইচ ব্যবহার করুন। আপনার কাছে কেবল 4 টি মামলা রয়েছে।
সোটিরিওস ডেলিমনলিস

12
যাইহোক, d.getCode() * -1==-d.getCode()
tckmn

ব্লচের কার্যকর জাভাটির Chapter ষ্ঠ অধ্যায় (কমপক্ষে 2E তে) আগ্রহী এবং উচ্চ প্রস্তাবিত হতে পারে।
jedwards

ntu.edu.sg/home/ehchua/programming/java/javaenum.html , বিভাগ 2.1 ধারণাটি পরিষ্কারভাবে ব্যাখ্যা করেছে
বিক্রমভি

উত্তর:


206

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

সুতরাং আপনার যা দরকার তা হল EnumType.ENUM_CONSTANT.methodName(arguments)


এখন প্রশ্ন থেকে সমস্যা ফিরে যেতে দিন। সমাধানগুলির একটি হতে পারে

public enum Direction {

    NORTH, SOUTH, EAST, WEST;

    private Direction opposite;

    static {
        NORTH.opposite = SOUTH;
        SOUTH.opposite = NORTH;
        EAST.opposite = WEST;
        WEST.opposite = EAST;
    }

    public Direction getOppositeDirection() {
        return opposite;
    }

}

এখন Direction.NORTH.getOppositeDirection()ফিরে আসবে Direction.SOUTH


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

public enum Direction {
    NORTH, EAST, SOUTH, WEST;

    // cached values to avoid recreating such array each time method is called
    private static final Direction[] VALUES = values();

    public Direction getOppositeDirection() {
        return VALUES[(ordinal() + 2) % 4]; 
    }
}

3
আমি একটি .values()[ordinal()]হ্যাক বেত্রাঘাত করতে
চলেছিলাম

আপনি কিভাবে এটি ব্যবহার করবেন, যদিও? এবং এই কৌশলটি কী বলা হয়?
থুফির

1
@ থুফির "আপনি কীভাবে এটি ব্যবহার করবেন " আপনি যদি পদ্ধতি সম্পর্কে জিজ্ঞাসা করছেন, তবে অন্য যে কোনও পদ্ধতির মতো - আপনি এই পদ্ধতির সাথে শ্রেণীর উদাহরণে এটি প্রার্থনা করেন। এর দৃষ্টান্ত Directionenum শ্রেণী NORTH, EAST, SOUTH, WESTযাতে আপনি শুধু ব্যবহার করতে পারেন NORTH.getOppositeDirection()এবং এটি ফিরে আসবে SOUTH। " এই কৌশলটি কী বলা হয়? " আপনি যদি static{...}এটি সম্পর্কে জিজ্ঞাসা করছেন তবে এটি স্ট্যাটিক ইনিশিয়ালাইজেশন ব্লক , ক্লাসটি প্রথমবার লোড করা হলে এটি কোড চালু করা হয় (এটি একই প্রক্রিয়ার অংশ যা স্থির ক্ষেত্রগুলি সূচনা করে)।
Pshemo

@ ফেমো, আমি অবাক হয়েছি যে উপরের কোডটির স্প্রিং সংস্করণটি কেমন হবে, যদি স্ট্যাটিক ব্লকে সেট করা মানগুলি বৈশিষ্ট্য ফাইল থেকে ইনজেকশনের প্রয়োজন হয়।
বিকাশ প্রসাদ

162

এর মতো একটি ছোট এনামের জন্য, আমি সর্বাধিক পঠনযোগ্য সমাধান খুঁজে পাচ্ছি:

public enum Direction {

    NORTH {
        @Override
        public Direction getOppositeDirection() {
            return SOUTH;
        }
    }, 
    SOUTH {
        @Override
        public Direction getOppositeDirection() {
            return NORTH;
        }
    },
    EAST {
        @Override
        public Direction getOppositeDirection() {
            return WEST;
        }
    },
    WEST {
        @Override
        public Direction getOppositeDirection() {
            return EAST;
        }
    };


    public abstract Direction getOppositeDirection();

}

8
ভালো বুদ্ধি! এটি যখন আপনি সাধারণত প্রতিটি এনাম মানটির একটি নির্দিষ্ট আচরণ করতে চান তাও ভাল।
ওফারবিআর

28

এইটা কাজ করে:

public enum Direction {
    NORTH, SOUTH, EAST, WEST;

    public Direction oppose() {
        switch(this) {
            case NORTH: return SOUTH;
            case SOUTH: return NORTH;
            case EAST:  return WEST;
            case WEST:  return EAST;
        }
        throw new RuntimeException("Case not implemented");
    }
}

8
একটি উপযুক্ত ডিফল্ট ধারাটি নাল ফেরার পরিবর্তে একটি উপযুক্ত রানটাইমএক্সসেপশন নিক্ষেপ করা আরও সুনির্দিষ্ট হতে পারে যে সদ্য যুক্ত হওয়া দিকের জন্য একটি বিপরীত সংজ্ঞা না দেওয়ার ক্ষেত্রে কোনও প্রোগ্রামার ত্রুটি ছিল।
টিমোথি055

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

14

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

এটি যদিও ভাল পড়া হয় না; সম্ভবত একটি switchআরও পরিচালিত হতে পারে?

public enum Direction {
    NORTH(1) {
        @Override
        public Direction getOppositeDirection() {
            return Direction.SOUTH;
        }
    },
    SOUTH(-1) {
        @Override
        public Direction getOppositeDirection() {
            return Direction.NORTH;
        }
    },
    EAST(-2) {
        @Override
        public Direction getOppositeDirection() {
            return Direction.WEST;
        }
    },
    WEST(2) {
        @Override
        public Direction getOppositeDirection() {
            return Direction.EAST;
        }
    };

    Direction(int code){
        this.code=code;
    }
    protected int code;

    public int getCode() {
        return this.code;
    }

    public abstract Direction getOppositeDirection();
}

4

হ্যাঁ আমরা সব সময় এটি করি। আপনি কোনও নতুন অবজেক্টের পরিবর্তে স্থির দৃষ্টান্তটি ফিরিয়ে দেন

 static Direction getOppositeDirection(Direction d){
       Direction result = null;
       if (d != null){
           int newCode = -d.getCode();
           for (Direction direction : Direction.values()){
               if (d.getCode() == newCode){
                   result = direction;
               }
           }
       }
       return result;
 }

0
public enum Direction {
    NORTH, EAST, SOUTH, WEST;

    public Direction getOppositeDirection(){
        return Direction.values()[(this.ordinal() + 2) % 4];
    }
}

এনামগুলির একটি স্থির মান পদ্ধতি রয়েছে যা এনামের সমস্ত মান যুক্ত করে সেটিকে ঘোষিত করার সাথে সাথে একটি অ্যারে প্রদান করে। উৎস

যেহেতু উত্তর 1 পায়, পূর্ব 2 পায়, দক্ষিণ 3 পায়, পশ্চিম 4 পায়; বিপরীতটি পেতে আপনি একটি সাধারণ সমীকরণ তৈরি করতে পারেন:

(মান + 2)% 4


2
কেন এই উত্তর? আপনি কীভাবে ভবিষ্যতের পাঠকদের বা এই বিষয়ে যে কেউ কোনও ব্যাখ্যা ছাড়াই শিখতে সহায়তা করবেন বলে আশা করছেন?
গ্রম্পি ক্রাউটন

যদিও এই কোডটি প্রশ্নের উত্তর দিতে পারে, কীভাবে এবং / বা কেন এটি সমস্যার সমাধান করে তা সম্পর্কিত অতিরিক্ত প্রসঙ্গ সরবরাহ করলে উত্তরের দীর্ঘমেয়াদী মান উন্নত হবে। মনে রাখবেন যে আপনি ভবিষ্যতে পাঠকদের জন্য প্রশ্নের উত্তর দিচ্ছেন, কেবল এখনই জিজ্ঞাসা করা ব্যক্তি নয়! একটি ব্যাখ্যা যুক্ত করতে দয়া করে আপনার উত্তরটি সম্পাদনা করুন এবং কোন সীমাবদ্ধতা এবং অনুমানগুলি প্রযোজ্য তা একটি ইঙ্গিত দিন। এই উত্তরটি কেন অন্যদের চেয়ে বেশি উপযুক্ত তা উল্লেখ করেও ক্ষতি করে না।
ItamarG3

মন্তব্য ছাড়া কোড পড়া কি শক্ত? অথবা আপনার কোডটির 7 লাইনের জন্য একচেটিয়া জাভাডোকের দরকার আছে?
প্রিগ্যান্টন

1
এই সমাধানটি ভঙ্গুর যেমন এটি এনাম মানগুলির ক্রমের উপর নির্ভর করে। আপনি যদি বর্ণমালার ক্রমটি পরিবর্তন করতে চান তবে আপনার চালাক সমীকরণটি আর সঠিক বিপরীতে সরবরাহ করবে না।
জোশ জে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.