এটি একটি পুরানো প্রশ্ন, তবে প্রত্যেকে এনামস আসলেই উল্লেখ করতে ব্যর্থ হয় Serializableএবং তাই কোনও অতিরিক্ত হিসাবে ইন্টেন্টে পুরোপুরি যুক্ত করা যায়। এটার মত:
public enum AwesomeEnum {
SOMETHING, OTHER;
}
intent.putExtra("AwesomeEnum", AwesomeEnum.SOMETHING);
AwesomeEnum result = (AwesomeEnum) intent.getSerializableExtra("AwesomeEnum");
স্ট্যাটিক বা অ্যাপ্লিকেশন-বিস্তৃত ভেরিয়েবলগুলি ব্যবহার করার পরামর্শটি একটি সত্যই খারাপ ধারণা। এটি সত্যই আপনার রাজ্য পরিচালনা ব্যবস্থাতে আপনার ক্রিয়াকলাপগুলিকে জুড়ে দেয় এবং এটি বজায় রাখা, ডিবাগ করা এবং সমস্যাবদ্ধ হওয়া শক্ত।
বিকল্প:
টেডিজ্যাকের দ্বারা ওডেরিকের প্রদত্ত সমাধানটি আপনাকে একটি ত্রুটি দেয় বলে একটি ভাল বিষয় উল্লেখ করা হয়েছিল । তবে দেওয়া বিকল্পটি ব্যবহার করার জন্য কিছুটা জটিল (এমনকি জেনেরিকগুলি ব্যবহার করে)।
যদি আপনি সত্যিই কোনও উদ্বেগের সাথে এনাম যুক্ত করার পারফরম্যান্স সম্পর্কে উদ্বিগ্ন হন তবে আমি পরিবর্তিত এই বিকল্পগুলির প্রস্তাব করছি:
বিকল্প 1:
public enum AwesomeEnum {
SOMETHING, OTHER;
private static final String name = AwesomeEnum.class.getName();
public void attachTo(Intent intent) {
intent.putExtra(name, ordinal());
}
public static AwesomeEnum detachFrom(Intent intent) {
if(!intent.hasExtra(name)) throw new IllegalStateException();
return values()[intent.getIntExtra(name, -1)];
}
}
ব্যবহার:
// Sender usage
AwesomeEnum.SOMETHING.attachTo(intent);
// Receiver usage
AwesomeEnum result = AwesomeEnum.detachFrom(intent);
বিকল্প 2:
(জেনেরিক, পুনরায় ব্যবহারযোগ্য এবং এনাম থেকে decoupled)
public final class EnumUtil {
public static class Serializer<T extends Enum<T>> extends Deserializer<T> {
private T victim;
@SuppressWarnings("unchecked")
public Serializer(T victim) {
super((Class<T>) victim.getClass());
this.victim = victim;
}
public void to(Intent intent) {
intent.putExtra(name, victim.ordinal());
}
}
public static class Deserializer<T extends Enum<T>> {
protected Class<T> victimType;
protected String name;
public Deserializer(Class<T> victimType) {
this.victimType = victimType;
this.name = victimType.getName();
}
public T from(Intent intent) {
if (!intent.hasExtra(name)) throw new IllegalStateException();
return victimType.getEnumConstants()[intent.getIntExtra(name, -1)];
}
}
public static <T extends Enum<T>> Deserializer<T> deserialize(Class<T> victim) {
return new Deserializer<T>(victim);
}
public static <T extends Enum<T>> Serializer<T> serialize(T victim) {
return new Serializer<T>(victim);
}
}
ব্যবহার:
// Sender usage
EnumUtil.serialize(AwesomeEnum.Something).to(intent);
// Receiver usage
AwesomeEnum result =
EnumUtil.deserialize(AwesomeEnum.class).from(intent);
বিকল্প 3 (কোটলিন সহ):
এটি একটি সময় হয়েছে, কিন্তু এখন থেকে আমাদের কোটলিন আছে, আমি ভেবেছিলাম নতুন দৃষ্টান্তের জন্য আমি আরও একটি বিকল্প যুক্ত করব। এখানে আমরা এক্সটেনশন ফাংশন এবং সংশোধিত প্রকারের (যা সংকলনের সময় টাইপ ধরে রাখে) ব্যবহার করতে পারি।
inline fun <reified T : Enum<T>> Intent.putExtra(victim: T): Intent =
putExtra(T::class.java.name, victim.ordinal)
inline fun <reified T: Enum<T>> Intent.getEnumExtra(): T? =
getIntExtra(T::class.java.name, -1)
.takeUnless { it == -1 }
?.let { T::class.java.enumConstants[it] }
এইভাবে এটি করার কয়েকটি সুবিধা রয়েছে।
- সিরিয়ালাইজেশন করার জন্য আমাদের কোনও মধ্যস্থতাকারী অবজেক্টের "ওভারহেড" প্রয়োজন নেই কারণ এটি সমস্ত স্থানে সম্পন্ন হয়েছে
inlineযার জন্য ফাংশনের অভ্যন্তরের কোডের সাথে কলগুলি প্রতিস্থাপন করবে thanks
- ফাংশনগুলি আরও পরিচিত কারণ তারা এসডিকে অনুরূপ।
- আইডিই এই ফাংশনগুলি স্বতঃপূরণ করবে যার অর্থ ইউটিলিটি শ্রেণীর পূর্বের জ্ঞান থাকা দরকার নেই।
ডাউনসাইডগুলির মধ্যে একটি হ'ল, আমরা যদি ইমদের ক্রমটি পরিবর্তন করি তবে কোনও পুরানো রেফারেন্স কাজ করবে না। এটি মুলতুবি থাকা ইন্টেন্টের অভ্যন্তরে অন্তর্ভুক্ত জাতীয় জিনিসগুলির সাথে সমস্যা হতে পারে কারণ তারা আপডেটগুলি টিকে থাকতে পারে। তবে, বাকি সময়ের জন্য, এটি ঠিক থাকা উচিত।
এটি উল্লেখ করা গুরুত্বপূর্ণ যে অন্যান্য সমাধানগুলি যেমন অবস্থানের পরিবর্তে নাম ব্যবহার করাও ব্যর্থ হবে যদি আমরা কোনও মানটির নাম পরিবর্তন করি। যদিও, এই ক্ষেত্রে, আমরা ভুল এনাম মানের পরিবর্তে একটি ব্যতিক্রম পাই।
ব্যবহার:
// Sender usage
intent.putExtra(AwesomeEnum.SOMETHING)
// Receiver usage
val result = intent.getEnumExtra<AwesomeEnum>()