CodeGym /جاوا بلاگ /Random-UR /جاوا سنگلٹن کلاس
John Squirrels
سطح
San Francisco

جاوا سنگلٹن کلاس

گروپ میں شائع ہوا۔
ہائے! آج ہم جاوا سنگلٹن پیٹرن سے شروع ہوکر مختلف ڈیزائن پیٹرن کی تفصیلات میں غوطہ لگائیں گے۔ آئیے جائزہ لیں: ہم عام طور پر ڈیزائن پیٹرن کے بارے میں کیا جانتے ہیں؟ ڈیزائن پیٹرن بہترین طرز عمل ہیں جن کا اطلاق ہم متعدد معلوم مسائل کو حل کرنے کے لیے کر سکتے ہیں۔ ڈیزائن پیٹرن عام طور پر کسی بھی پروگرامنگ زبان سے منسلک نہیں ہوتے ہیں۔ غلطیوں سے بچنے اور پہیے کو دوبارہ ایجاد کرنے سے بچنے میں مدد کے لیے ان کو سفارشات کے ایک سیٹ کے طور پر سوچیں۔ڈیزائن پیٹرن: سنگلٹن - 1

جاوا میں سنگلٹن کیا ہے؟

سنگلٹن کلاس لیول کے سب سے آسان ڈیزائن پیٹرن میں سے ایک ہے۔ بعض اوقات لوگ کہتے ہیں "یہ کلاس سنگلٹن ہے"، جس کا مطلب ہے کہ کلاس سنگلٹن ڈیزائن پیٹرن کو لاگو کرتی ہے۔ بعض اوقات یہ ایک کلاس لکھنا ضروری ہوتا ہے جہاں ہم انسٹی ٹیشن کو کسی ایک شے تک محدود رکھتے ہیں۔ مثال کے طور پر، ایک کلاس لاگ ان کرنے یا اس سے جڑنے کے لیے ذمہ دار ہے۔ ڈیٹا بیس۔ سنگلٹن ڈیزائن پیٹرن بیان کرتا ہے کہ ہم اسے کیسے حاصل کرسکتے ہیں۔ سنگلٹن ایک ڈیزائن پیٹرن ہے جو دو چیزیں کرتا ہے:
  1. یہ ضمانت دیتا ہے کہ کلاس کی صرف ایک ہی مثال ہوگی۔

  2. یہ اس مثال تک عالمی رسائی کا ایک نقطہ فراہم کرتا ہے۔

لہذا، دو خصوصیات ہیں جو سنگلٹن پیٹرن کے تقریباً ہر نفاذ کی خصوصیت ہیں:
  1. ایک پرائیویٹ کنسٹرکٹر۔ یہ کلاس سے باہر کلاس کی اشیاء بنانے کی صلاحیت کو محدود کرتا ہے۔

  2. ایک عوامی جامد طریقہ جو کلاس کی مثال واپس کرتا ہے۔ اس طریقہ کو getInstance کہا جاتا ہے ۔ یہ کلاس مثال تک عالمی رسائی کا نقطہ ہے۔

نفاذ کے اختیارات

سنگلٹن ڈیزائن پیٹرن کو مختلف طریقوں سے لاگو کیا جاتا ہے۔ ہر آپشن اپنے طریقے سے اچھا اور برا ہوتا ہے۔ ہمیشہ کی طرح، یہاں کوئی بہترین آپشن نہیں ہے، لیکن ہمیں ایک کے لیے کوشش کرنی چاہیے۔ سب سے پہلے، آئیے فیصلہ کرتے ہیں کہ اچھا اور برا کیا ہے، اور کون سے میٹرکس اس پر اثر انداز ہوتے ہیں کہ ہم ڈیزائن پیٹرن کے مختلف نفاذ کا اندازہ کیسے لگاتے ہیں۔ آئیے اچھے کے ساتھ شروع کریں۔ یہاں ایسے عوامل ہیں جو نفاذ کو زیادہ رسیلی اور دلکش بناتے ہیں:
  • سست ابتداء: مثال اس وقت تک نہیں بنائی جاتی جب تک اس کی ضرورت نہ ہو۔

  • سادہ اور شفاف کوڈ: یہ میٹرک یقیناً موضوعی ہے، لیکن یہ اہم ہے۔

  • تھریڈ سیفٹی: ملٹی تھریڈ والے ماحول میں درست آپریشن۔

  • ملٹی تھریڈ والے ماحول میں اعلی کارکردگی: وسائل کا اشتراک کرتے وقت تھریڈ کو بہت کم یا کوئی بلاک نہیں کرنا۔

اب cons. ہم ان عوامل کی فہرست بنائیں گے جو نفاذ کو بری روشنی میں ڈالتے ہیں:
  • کوئی سست آغاز نہیں: جب ایپلیکیشن شروع ہونے پر کلاس لوڈ ہو، چاہے اس کی ضرورت ہو یا نہ ہو (متضاد طور پر، آئی ٹی کی دنیا میں سست ہونا بہتر ہے)

  • پیچیدہ اور پڑھنے میں مشکل کوڈ۔ یہ میٹرک بھی موضوعی ہے۔ اگر آپ کی آنکھوں سے خون بہنے لگتا ہے، تو ہم فرض کریں گے کہ نفاذ بہترین نہیں ہے۔

  • دھاگے کی حفاظت کا فقدان۔ دوسرے لفظوں میں، "دھاگے کا خطرہ"۔ ملٹی تھریڈ والے ماحول میں غلط آپریشن۔

  • ملٹی تھریڈ والے ماحول میں خراب کارکردگی: دھاگے ہر وقت یا اکثر وسائل کا اشتراک کرتے وقت ایک دوسرے کو روکتے ہیں۔

کوڈ

اب ہم نفاذ کے مختلف اختیارات پر غور کرنے اور فوائد اور نقصانات کی نشاندہی کرنے کے لیے تیار ہیں:

سادہ


public class Singleton {
    private static final Singleton INSTANCE = new Singleton();
    
    private Singleton() {
    }
    
    public static Singleton getInstance() {
        return INSTANCE;
    }
}
سب سے آسان عمل درآمد۔ فوائد:
  • سادہ اور شفاف کوڈ

  • دھاگے کی حفاظت

  • ملٹی تھریڈڈ ماحول میں اعلی کارکردگی

Cons کے:
  • کوئی سست ابتدا نہیں ہے۔
پچھلی کوتاہیوں کو دور کرنے کی کوشش میں، ہمیں نفاذ نمبر دو ملتا ہے:

سست آغاز


public class Singleton {
  private static final Singleton INSTANCE;

  private Singleton() {}

  public static Singleton getInstance() {
    if (INSTANCE == null) {
      INSTANCE = new Singleton();
    }
    return INSTANCE;
  }
}
فوائد:
  • سست آغاز۔

Cons کے:
  • دھاگہ محفوظ نہیں ہے۔

یہ نفاذ دلچسپ ہے۔ ہم سستی سے شروع کر سکتے ہیں، لیکن ہم دھاگے کی حفاظت کھو چکے ہیں۔ پریشان ہونے کی کوئی بات نہیں - ہم نفاذ نمبر تین میں ہر چیز کو ہم آہنگ کرتے ہیں۔

مطابقت پذیر رسائی


public class Singleton {
  private static final Singleton INSTANCE;

  private Singleton() {
  }

  public static synchronized Singleton getInstance() {
    if (INSTANCE == null) {
      INSTANCE = new Singleton();
    }
    return INSTANCE;
  }
}
فوائد:
  • سست آغاز۔

  • دھاگے کی حفاظت

Cons کے:
  • ناقص ملٹی تھریڈ کارکردگی

بہترین! عمل درآمد نمبر تین میں، ہم دھاگے کی حفاظت کو بحال کرتے ہیں! بلاشبہ، یہ سست ہے... اب getInstance طریقہ مطابقت پذیر ہے، لہذا اسے ایک وقت میں صرف ایک دھاگے سے عمل میں لایا جا سکتا ہے۔ پورے طریقہ کو سنکرونائز کرنے کے بجائے، ہمیں اصل میں اس کے صرف اس حصے کو سنکرونائز کرنے کی ضرورت ہے جو نئی مثال کو شروع کرے۔ لیکن ہم نئی مثال بنانے کے لیے ذمہ دار حصے کو سمیٹنے کے لیے ہم وقت ساز بلاک کا استعمال نہیں کر سکتے ۔ ایسا کرنے سے دھاگے کی حفاظت یقینی نہیں ہوگی۔ یہ سب کچھ زیادہ پیچیدہ ہے۔ مناسب مطابقت پذیری ذیل میں دیکھی جا سکتی ہے:

ڈبل چیک شدہ لاکنگ


public class Singleton {
    private static final Singleton INSTANCE;

  private Singleton() {
  }

    public static Singleton getInstance() {
        if (INSTANCE == null) {
            synchronized (Singleton.class) {
                if (INSTANCE == null) {
                    INSTANCE = new Singleton();
                }
            }
        }
        return INSTANCE;
    }
}
فوائد:
  • سست آغاز۔

  • دھاگے کی حفاظت

  • ملٹی تھریڈڈ ماحول میں اعلی کارکردگی

Cons کے:
  • 1.5 سے نیچے جاوا کے پہلے ورژن میں تعاون یافتہ نہیں ہے (1.5 ورژن سے اتار چڑھاؤ والے مطلوبہ الفاظ کا استعمال طے ہے)

نوٹ کریں کہ نفاذ کے اس اختیار کے صحیح طریقے سے کام کرنے کے لیے، دو شرائط میں سے ایک کا پورا ہونا ضروری ہے۔ INSTANCE متغیر یا تو حتمی یا غیر مستحکم ہونا چاہیے ۔ آخری نفاذ جس پر ہم آج بحث کریں گے وہ ہے کلاس ہولڈر سنگلٹن ۔

کلاس ہولڈر


public class Singleton {

   private Singleton() {
   }

   private static class SingletonHolder {
       public static final Singleton HOLDER_INSTANCE = new Singleton();
   }

   public static Singleton getInstance() {
       return SingletonHolder.HOLDER_INSTANCE;
   }
}
فوائد:
  • سست آغاز۔

  • دھاگے کی حفاظت۔

  • ملٹی تھریڈڈ ماحول میں اعلی کارکردگی۔

Cons کے:
  • درست آپریشن کے لیے ایک گارنٹی کی ضرورت ہوتی ہے کہ سنگلٹن آبجیکٹ کو بغیر کسی غلطی کے شروع کیا جائے۔ دوسری صورت میں، getInstance کے طریقہ کار پر پہلی کال کا نتیجہ ExceptionInInitializerError ہو گا ، اور اس کے بعد کی تمام کالیں NoClassDefFoundError پیدا کریں گی ۔

یہ نفاذ تقریباً کامل ہے۔ یہ سست ہے، اور دھاگہ محفوظ، اور تیز ہے۔ لیکن اس کی ایک اہمیت ہے، جیسا کہ cons کی فہرست میں بیان کیا گیا ہے۔ سنگلٹن پیٹرن کے مختلف نفاذ کا موازنہ:
عمل درآمد سست آغاز دھاگے کی حفاظت ملٹی تھریڈ کارکردگی کب استعمال کریں؟
سادہ - + تیز کبھی نہیں۔ یا ممکنہ طور پر جب سست آغاز اہم نہیں ہے۔ لیکن کبھی بھی بہتر نہیں ہوگا۔
سست آغاز + - قابل اطلاق نہیں۔ ہمیشہ جب ملٹی تھریڈنگ کی ضرورت نہ ہو۔
مطابقت پذیر رسائی + + سست کبھی نہیں۔ یا ممکنہ طور پر جب ملٹی تھریڈ کارکردگی سے کوئی فرق نہیں پڑتا ہے۔ لیکن کبھی بھی بہتر نہیں ہوگا۔
ڈبل چیک شدہ لاکنگ + + تیز غیر معمولی معاملات میں جب آپ کو سنگلٹن بناتے وقت مستثنیات کو سنبھالنے کی ضرورت ہوتی ہے (جب کلاس ہولڈر سنگلٹن لاگو نہیں ہوتا ہے)
کلاس ہولڈر + + تیز جب بھی ملٹی تھریڈنگ کی ضرورت ہوتی ہے اور اس بات کی گارنٹی ہوتی ہے کہ سنگلٹن آبجیکٹ بغیر کسی پریشانی کے بن جائے گا۔

سنگلٹن پیٹرن کے فوائد اور نقصانات

عام طور پر، سنگلٹن بالکل وہی کرتا ہے جس کی اس سے توقع کی جاتی ہے:
  1. یہ ضمانت دیتا ہے کہ کلاس کی صرف ایک ہی مثال ہوگی۔

  2. یہ اس مثال تک عالمی رسائی کا ایک نقطہ فراہم کرتا ہے۔

تاہم، اس پیٹرن میں کوتاہیاں ہیں:
  1. سنگلٹن واحد ذمہ داری کے اصول کی خلاف ورزی کرتا ہے: اپنے براہ راست فرائض کے علاوہ، سنگلٹن کلاس مثالوں کی تعداد کو بھی کنٹرول کرتی ہے۔

  2. ایک عام طبقے کا سنگلٹن پر انحصار کلاس کے پبلک کنٹریکٹ میں نظر نہیں آتا۔

  3. عالمی متغیرات خراب ہیں۔ بالآخر، سنگلٹن ایک بھاری عالمی متغیر میں بدل جاتا ہے۔

  4. سنگلٹن کی موجودگی مجموعی طور پر ایپلی کیشن اور خاص طور پر سنگلٹن کو استعمال کرنے والی کلاسوں کی قابلیت کو کم کرتی ہے۔

اور یہ بات ہے! :) ہم نے آپ کے ساتھ جاوا سنگلٹن کلاس کو دریافت کیا ہے۔ اب، اپنی باقی زندگی کے لیے، اپنے پروگرامر دوستوں کے ساتھ بات چیت کرتے وقت، آپ نہ صرف اس بات کا ذکر کر سکتے ہیں کہ پیٹرن کتنا اچھا ہے، بلکہ اس کے بارے میں کچھ الفاظ بھی بتا سکتے ہیں کہ اسے کیا برا بناتا ہے۔ اس نئے علم میں مہارت حاصل کرنے میں گڈ لک۔

اضافی پڑھنا:

تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION