অ্যানড্রয়েডে এনামসের সাথে কাজ করা


120

আমি আমার অ্যাপ্লিকেশনের জন্য অ্যান্ড্রয়েডের সাথে কাজ করছি এমন একটি গণনা ক্রিয়াকলাপটি প্রায় সম্পন্ন করেছি। আমি একটি লিঙ্গ এনাম তৈরির চেষ্টা করি, তবে সিনট্যাক্স ত্রুটির কারণে কিছু কারণে এনুমডেকলেশন সম্পূর্ণ করতে "এনামবডি" sertোকান।

public static enum Gender
{
    static
    {
        Female = new Gender("Female", 1);
        Gender[] arrayOfGender = new Gender[2];
        arrayOfGender[0] = Male;
        arrayOfGender[1] = Female;
        ENUM$VALUES = arrayOfGender;
    }
}

স্থির without without ছাড়াও আমি এটি চেষ্টা করেছি তবে আমি একই বাক্য গঠন ত্রুটি পেয়েছি।


পারফরম্যান্স ইস্যুগুলির জন্য এনামগুলিকে সুপারিশ করা হয় না, পরিবর্তে আদিম ধ্রুবক ব্যবহার করুন। youtube.com/watch?v=Hzs6OBcvNQE
মাইকে দেব

আপডেট 2019: Enums অ্যান্ড্রয়েড ব্যবহার করার জন্য জরিমানা থেকে এআরটি রানটাইম এনভায়রনমেন্ট যেমন Dalvik প্রতিস্থাপিত হয় stackoverflow.com/a/56296746/4213436 । সুতরাং আমি এই থ্রেডের বেশিরভাগ উত্তর অপ্রাসঙ্গিক বলে মনে করি।
জেডেনাইস

@ জেডেনাইস অবশ্যই আপনার থ্রেডটির অর্থ 'আপনি' কেবল রেফারেন্স করেছেন
ইউসুফফির

উত্তর:


343

পৃথিবীতে আপনি এই বাক্য গঠনটি কোথায় পেলেন? জাভা এনামগুলি খুব সহজ, আপনি কেবল মানগুলি নির্দিষ্ট করেন।

public enum Gender {
   MALE,
   FEMALE
}

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

public enum Gender {
    MALE("Male", 0),
    FEMALE("Female", 1);

    private String stringValue;
    private int intValue;
    private Gender(String toString, int value) {
        stringValue = toString;
        intValue = value;
    }

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

তারপরে এনামটি ব্যবহার করতে, আপনি এই জাতীয় কিছু করবেন:

Gender me = Gender.MALE

11
আমি একটি চেষ্টা করব, আমি বলেছিলাম যে আমি একেবারে শিক্ষানবিশ ছিলাম
জেএমএসডিএভি

86
দুঃখিত, আমি এর অর্থ নেতিবাচক ছিল না। এনাম
স্পিডি

3
এনামগুলিকে উল্লেখ করার জন্য এটিও সহায়ক, ক্রমযুক্ত যাতে আপনি মানটি পেতে এনুমে .ordinal () ব্যবহার করতে পারেন।
কালেল ওয়েড

1
প্রশ্নটির বাক্য গঠনটি হ'ল এক ধরনের ডিসকপিলার ব্যবহার করে আসতে পারে।
ড্যান গেটেজ

9
"পৃথিবীতে আপনি কোথায় এই সিনট্যাক্সটি পেলেন" এ নিয়ে আমি হেসেছি। তার শিক্ষার্থীর কাছে কেবল একজন শিক্ষকের মতো কথা বলা
জার ই আহমর

50

এই বিতর্ককে কেন্দ্র করে কিছু বিতর্ক হয়েছিল, তবে এমনকি সাম্প্রতিকতম নথিতে অ্যান্ড্রয়েডও পরামর্শ দেয় যে অ্যান্ড্রয়েড অ্যাপ্লিকেশনটিতে এনামগুলি ব্যবহার করা এত ভাল ধারণা নয়। কারণ একটি স্ট্যাটিক কনস্ট্যান্ট ভেরিয়েবলের চেয়ে তারা বেশি মেমরি ব্যবহার করে। এখানে 2014 এর একটি পৃষ্ঠার একটি নথি যা একটি অ্যান্ড্রয়েড অ্যাপ্লিকেশনটিতে এনাম ব্যবহারের বিরুদ্ধে পরামর্শ দেয়। http://developer.android.com/training/articles/memory.html#Overhead

আমি উদ্ধৃতি:

ওভারহেড স্মৃতি সচেতন হন

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

  • এনামগুলিতে প্রায়শই স্থির ধ্রুবকের চেয়ে দ্বিগুণেরও বেশি মেমরির প্রয়োজন হয়। অ্যান্ড্রয়েডে এনাম ব্যবহার করা আপনার কঠোরভাবে এড়ানো উচিত।

  • জাভাতে প্রতিটি শ্রেণি (বেনামে অভ্যন্তরীণ ক্লাস সহ) কোডের প্রায় 500 বাইট ব্যবহার করে।

  • প্রতিটি শ্রেণীর উদাহরণে 12-16 বাইট র‌্যামের ওভারহেড থাকে।

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

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

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


কিছু জায়গা হয়েছে - আপনি যদি সেগুলি জানেন তবে কিছু যুক্ত করতে পারেন? কারণ আমি কোনও খুঁজে পাচ্ছি না
ক্রিজিসটফ স্ক্রাজাইনেক্কি

9
এখানে কেউ লক্ষ করেছেন যে enums এর পরিবর্তে ints ব্যবহারের তথ্য অফিসিয়াল ডকুমেন্টেশনে পারফরম্যান্স টিপস থেকে সরানো হয়েছিল । তদুপরি, আমি গবেষণা করেছি এবং রেডডিট সম্পর্কিত সারাংশ
ক্রিজিসটফ স্ক্রাজিনেককি

1
অ্যান্ড্রয়েড পারফরম্যান্স প্যাটার্নস: এনইউএমএসের দাম (গুগল দেবের 100 দিন)
আফ্রিজা এন আরিফ

বন্ধুরা, আমার প্রশ্ন হ'ল এনুম যদি "খারাপ" অনুশীলন হয় তবে গুগল কেন এখনও অ্যান্ড্রয়েডের সাথে জাভার এই বৈশিষ্ট্যটিকে সমর্থন করে? :(
জেসের কাস্ত্রো

5
@ জেসিসকাস্ট্রো কারণ গুগল নিশ্চিত করতে চায় যে প্রচুর বিদ্যমান জাভা বিজনেস যুক্তিযুক্ত সংস্থাগুলি (যা এনাম ব্যবহার করতে পারে) কেবল তাদের অ্যানড্রয়েড প্রকল্পে তাদের লাইব্রেরিটি ফেলে দিতে পারে।
ডেভিড ব্রাউন

22

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

public abstract class ActionBar {
...
@IntDef({NAVIGATION_MODE_STANDARD, NAVIGATION_MODE_LIST, NAVIGATION_MODE_TABS})
@Retention(RetentionPolicy.SOURCE)
public @interface NavigationMode {}

public static final int NAVIGATION_MODE_STANDARD = 0;
public static final int NAVIGATION_MODE_LIST = 1;
public static final int NAVIGATION_MODE_TABS = 2;

@NavigationMode
public abstract int getNavigationMode();

public abstract void setNavigationMode(@NavigationMode int mode);

এটি বাইনারি রচনা (OR / AND ক্রিয়াকলাপ) এর অনুমতি দিয়ে পতাকা হিসাবে ব্যবহার করা যেতে পারে।

সম্পাদনা : দেখে মনে হয় যে এনামগুলিকে ইনটগুলিতে রূপান্তর করা প্রুগার্ডের একটি ডিফল্ট অপ্টিমাইজেশান


3
আমি সরাসরি এনটোটেশন ক্লাসে ইনট কনস্ট্যান্ট স্থাপন করতে চাই। এটি দেখতে নিয়মিত এনামের মতো লাগে। আমি এখানে এটি বর্ণনা করেছি: blog.shamanland.com/2016/02/int-string-enum.html
ওলেক্সি কে।


9

এই ভিডিও অনুসারে আপনি যদি প্রোগার্ড ব্যবহার করেন তবে আপনার এনামসের পারফরম্যান্স সম্পর্কিত সমস্যাগুলি সম্পর্কেও ভাবার দরকার নেই !!

প্রিগার্ডটি আপনার পক্ষে এনাম মানগুলিতে এনামকে অনুকূলিত করতে পারে তাই সত্যই এটি সম্পর্কে ভাবার দরকার নেই বা কোনও কাজ করার দরকার নেই।


4

অ্যানড্রয়েডের পছন্দের পদ্ধতির @IntDef এর সাথে প্রয়োগ করা ধ্রুবকগুলি:

public static final int GENDER_MALE = 1;
public static final int GENDER_FEMALE = 2;

@Retention(RetentionPolicy.SOURCE)
@IntDef ({GENDER_MALE, GENDER_FEMALE})
public @interface Gender{}

// Example usage...
void exampleFunc(@Gender int gender) {
  switch(gender) {
  case GENDER_MALE:

     break;
  case GENDER_FEMALE:
     // TODO
     break;
  }
}

দস্তাবেজ: https://developer.android.com/studio/write/annotations.html#enum-annotations

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