কোনও প্রোগ্রামিং ভাষার বৈশিষ্ট্য কেন ব্যবহার করবেন? আমাদের যেহেতু ভাষা আছে সেটির কারণ
- প্রোগ্রামারগণ দক্ষতার সাথে এবং সঠিকভাবে আলগোরিদিমগুলি প্রকাশ করতে একটি ফর্ম কম্পিউটার ব্যবহার করতে পারেন।
- অন্যদের অ্যালগরিদম বোঝার জন্য রক্ষণাবেক্ষণকারীরা লিখেছেন এবং সঠিকভাবে পরিবর্তন করেছেন।
এনামগুলি প্রচুর বয়লারপ্লেট না লিখে নির্ভুলতা এবং পাঠযোগ্যতার উভয় সম্ভাবনা উন্নত করে। আপনি যদি বয়লারপ্লেট লিখতে ইচ্ছুক হন তবে আপনি এনামগুলিকে "অনুকরণ" করতে পারেন:
public class Color {
private Color() {} // Prevent others from making colors.
public static final Color RED = new Color();
public static final Color AMBER = new Color();
public static final Color GREEN = new Color();
}
এখন আপনি লিখতে পারেন:
Color trafficLightColor = Color.RED;
উপরের বয়লারপ্লেটের মতো একই প্রভাব রয়েছে
public enum Color { RED, AMBER, GREEN };
উভয়ই সংকলক থেকে একই স্তরের চেকিং সহায়তা সরবরাহ করে। বয়লারপ্লেটটি কেবল আরও টাইপ করা। তবে প্রচুর টাইপিং সংরক্ষণ করা প্রোগ্রামারটিকে আরও দক্ষ করে তোলে (দেখুন 1), সুতরাং এটি একটি সার্থক বৈশিষ্ট্য।
এটি কমপক্ষে আরও একটি কারণেও সার্থক:
বিবৃতি পরিবর্তন করুন
static final
উপরের এনাম সিমুলেশনটি আপনাকে দেয় না এমন একটি জিনিস হ'ল সুন্দর switch
ক্ষেত্রে। এনাম প্রকারের জন্য, জাভা স্যুইচটি এনামের মামলার পরিধি নির্ধারণ করতে তার পরিবর্তনশীলের প্রকারটি ব্যবহার করে, সুতরাং উপরেরগুলির জন্য enum Color
আপনাকে কেবল বলা দরকার:
Color color = ... ;
switch (color) {
case RED:
...
break;
}
নোট করুন এটি Color.RED
ক্ষেত্রে হয় না। আপনি যদি এনাম ব্যবহার না করেন তবে নামযুক্ত পরিমাণ ব্যবহারের একমাত্র উপায় switch
হ'ল:
public Class Color {
public static final int RED = 0;
public static final int AMBER = 1;
public static final int GREEN = 2;
}
তবে এখন রঙ ধারণ করতে একটি ভেরিয়েবলের প্রকারটি অবশ্যই থাকতে হবে int
। এনাম এবং static final
সিমুলেশনটির দুর্দান্ত সংকলক চেকিং শেষ। অসুখী.
একটি আপস হ'ল সিমুলেশনে কোনও স্কেলারের মূল্যবান সদস্য ব্যবহার করা:
public class Color {
public static final int RED_TAG = 1;
public static final int AMBER_TAG = 2;
public static final int GREEN_TAG = 3;
public final int tag;
private Color(int tag) { this.tag = tag; }
public static final Color RED = new Color(RED_TAG);
public static final Color AMBER = new Color(AMBER_TAG);
public static final Color GREEN = new Color(GREEN_TAG);
}
এখন:
Color color = ... ;
switch (color.tag) {
case Color.RED_TAG:
...
break;
}
তবে খেয়াল করুন, আরও বয়লারপ্লেট!
সিঙ্গেলটন হিসাবে একটি এনাম ব্যবহার করা
উপরের বয়লারপ্লেট থেকে আপনি দেখতে পাচ্ছেন যে কেন একটি এনাম একটি সিঙ্গলটন বাস্তবায়নের জন্য একটি উপায় সরবরাহ করে। লেখার পরিবর্তে:
public class SingletonClass {
public static final void INSTANCE = new SingletonClass();
private SingletonClass() {}
// all the methods and instance data for the class here
}
এবং তারপরে এটি অ্যাক্সেস করা
SingletonClass.INSTANCE
আমরা শুধু বলতে পারি
public enum SingletonClass {
INSTANCE;
// all the methods and instance data for the class here
}
যা আমাদের একই জিনিস দেয়। আমরা এই দিয়ে পার পেতে পারে না, কারণ জাভা enums হয় শুধুমাত্র একটি সামান্য অন্বিত উপরের উপর সিঁচিত চিনি সঙ্গে পূর্ণ শ্রেণীর হিসাবে প্রয়োগ করা। এটি আবার কম বয়লারপ্লেট তবে আইডিয়ামটি আপনার পরিচিত না হলে এটি স্পষ্ট নয়। আমিও যে আপনি বিভিন্ন enum ফাংশন পেতে যদিও তারা Singleton জন্য অনেক মানে হয় না অপছন্দ: ord
এবং values
, ইত্যাদি (আছে আসলে একটি, trickier সিমুলেশন কোথায় Color extends Integer
যে সুইচ সঙ্গে কাজ করবে, কিন্তু এটা যাতে চতুর এটা যে আরও বেশি কেন enum
একটি ভাল ধারণা তা স্পষ্টভাবে দেখায় ))
থ্রেড সুরক্ষা
থ্রেড সুরক্ষা কেবল তখনই সম্ভাব্য সমস্যা যখন সিলেটলেটগুলি অলসভাবে লক না করে তৈরি করা হয়।
public class SingletonClass {
private static SingletonClass INSTANCE;
private SingletonClass() {}
public SingletonClass getInstance() {
if (INSTANCE == null) INSTANCE = new SingletonClass();
return INSTANCE;
}
// all the methods and instance data for the class here
}
এখনও যদি শূন্য থাকা getInstance
অবস্থায় অনেক থ্রেড একই সাথে কল করে তবে INSTANCE
যে কোনও সংখ্যক উদাহরণ তৈরি করা যেতে পারে। এইটা খারাপ. synchronized
চলকটি রক্ষা করতে একমাত্র সমাধান হ'ল অ্যাক্সেস যুক্ত করা INSTANCE
।
তবে static final
উপরের কোডটিতে এই সমস্যা নেই। এটি ক্লাস লোডের সময়টি আগ্রহের সাথে তৈরি করে। শ্রেণি লোড সিঙ্ক্রোনাইজ করা হয়।
enum
Singleton কার্যকরভাবে অলস কারণ এটি প্রথম ব্যবহারের পর্যন্ত সক্রিয়া না হয়। জাভা সূচনাটিও সিঙ্ক্রোনাইজ করা হয়েছে, তাই একাধিক থ্রেড একের অধিক উদাহরণকে আরম্ভ করতে পারে না INSTANCE
। আপনি খুব অল্প কোড সহ একটি অলসভাবে প্রাথমিক সিঙ্গলটন পাচ্ছেন। একমাত্র নেতিবাচক হ'ল বরং অস্পষ্ট সিনট্যাক্স। ক্লাস লোডিং এবং ইনিশিয়ালেশন কী হচ্ছে তা জানার জন্য আপনার কীভাবে আইডিয়মটি জানতে হবে বা পুঙ্খানুপুঙ্খভাবে বুঝতে হবে।