جاوا میں سنگلٹن کیا ہے؟
سنگلٹن کلاس لیول کے سب سے آسان ڈیزائن پیٹرن میں سے ایک ہے۔ بعض اوقات لوگ کہتے ہیں "یہ کلاس سنگلٹن ہے"، جس کا مطلب ہے کہ کلاس سنگلٹن ڈیزائن پیٹرن کو لاگو کرتی ہے۔ بعض اوقات یہ ایک کلاس لکھنا ضروری ہوتا ہے جہاں ہم انسٹی ٹیشن کو کسی ایک شے تک محدود رکھتے ہیں۔ مثال کے طور پر، ایک کلاس لاگ ان کرنے یا اس سے جڑنے کے لیے ذمہ دار ہے۔ ڈیٹا بیس۔ سنگلٹن ڈیزائن پیٹرن بیان کرتا ہے کہ ہم اسے کیسے حاصل کرسکتے ہیں۔ سنگلٹن ایک ڈیزائن پیٹرن ہے جو دو چیزیں کرتا ہے:-
یہ ضمانت دیتا ہے کہ کلاس کی صرف ایک ہی مثال ہوگی۔
-
یہ اس مثال تک عالمی رسائی کا ایک نقطہ فراہم کرتا ہے۔
-
ایک پرائیویٹ کنسٹرکٹر۔ یہ کلاس سے باہر کلاس کی اشیاء بنانے کی صلاحیت کو محدود کرتا ہے۔
-
ایک عوامی جامد طریقہ جو کلاس کی مثال واپس کرتا ہے۔ اس طریقہ کو getInstance کہا جاتا ہے ۔ یہ کلاس مثال تک عالمی رسائی کا نقطہ ہے۔
نفاذ کے اختیارات
سنگلٹن ڈیزائن پیٹرن کو مختلف طریقوں سے لاگو کیا جاتا ہے۔ ہر آپشن اپنے طریقے سے اچھا اور برا ہوتا ہے۔ ہمیشہ کی طرح، یہاں کوئی بہترین آپشن نہیں ہے، لیکن ہمیں ایک کے لیے کوشش کرنی چاہیے۔ سب سے پہلے، آئیے فیصلہ کرتے ہیں کہ اچھا اور برا کیا ہے، اور کون سے میٹرکس اس پر اثر انداز ہوتے ہیں کہ ہم ڈیزائن پیٹرن کے مختلف نفاذ کا اندازہ کیسے لگاتے ہیں۔ آئیے اچھے کے ساتھ شروع کریں۔ یہاں ایسے عوامل ہیں جو نفاذ کو زیادہ رسیلی اور دلکش بناتے ہیں:-
سست ابتداء: مثال اس وقت تک نہیں بنائی جاتی جب تک اس کی ضرورت نہ ہو۔
-
سادہ اور شفاف کوڈ: یہ میٹرک یقیناً موضوعی ہے، لیکن یہ اہم ہے۔
-
تھریڈ سیفٹی: ملٹی تھریڈ والے ماحول میں درست آپریشن۔
-
ملٹی تھریڈ والے ماحول میں اعلی کارکردگی: وسائل کا اشتراک کرتے وقت تھریڈ کو بہت کم یا کوئی بلاک نہیں کرنا۔
-
کوئی سست آغاز نہیں: جب ایپلیکیشن شروع ہونے پر کلاس لوڈ ہو، چاہے اس کی ضرورت ہو یا نہ ہو (متضاد طور پر، آئی ٹی کی دنیا میں سست ہونا بہتر ہے)
-
پیچیدہ اور پڑھنے میں مشکل کوڈ۔ یہ میٹرک بھی موضوعی ہے۔ اگر آپ کی آنکھوں سے خون بہنے لگتا ہے، تو ہم فرض کریں گے کہ نفاذ بہترین نہیں ہے۔
-
دھاگے کی حفاظت کا فقدان۔ دوسرے لفظوں میں، "دھاگے کا خطرہ"۔ ملٹی تھریڈ والے ماحول میں غلط آپریشن۔
-
ملٹی تھریڈ والے ماحول میں خراب کارکردگی: دھاگے ہر وقت یا اکثر وسائل کا اشتراک کرتے وقت ایک دوسرے کو روکتے ہیں۔
کوڈ
اب ہم نفاذ کے مختلف اختیارات پر غور کرنے اور فوائد اور نقصانات کی نشاندہی کرنے کے لیے تیار ہیں:سادہ
public class Singleton {
private static final Singleton INSTANCE = new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
return INSTANCE;
}
}
سب سے آسان عمل درآمد۔ فوائد:
-
سادہ اور شفاف کوڈ
-
دھاگے کی حفاظت
-
ملٹی تھریڈڈ ماحول میں اعلی کارکردگی
- کوئی سست ابتدا نہیں ہے۔
سست آغاز
public class Singleton {
private static final Singleton INSTANCE;
private Singleton() {}
public static Singleton getInstance() {
if (INSTANCE == null) {
INSTANCE = new Singleton();
}
return INSTANCE;
}
}
فوائد:
-
سست آغاز۔
-
دھاگہ محفوظ نہیں ہے۔
مطابقت پذیر رسائی
public class Singleton {
private static final Singleton INSTANCE;
private Singleton() {
}
public static synchronized Singleton getInstance() {
if (INSTANCE == null) {
INSTANCE = new Singleton();
}
return INSTANCE;
}
}
فوائد:
-
سست آغاز۔
-
دھاگے کی حفاظت
-
ناقص ملٹی تھریڈ کارکردگی
ڈبل چیک شدہ لاکنگ
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;
}
}
فوائد:
-
سست آغاز۔
-
دھاگے کی حفاظت
-
ملٹی تھریڈڈ ماحول میں اعلی کارکردگی
-
1.5 سے نیچے جاوا کے پہلے ورژن میں تعاون یافتہ نہیں ہے (1.5 ورژن سے اتار چڑھاؤ والے مطلوبہ الفاظ کا استعمال طے ہے)
کلاس ہولڈر
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;
}
}
فوائد:
-
سست آغاز۔
-
دھاگے کی حفاظت۔
-
ملٹی تھریڈڈ ماحول میں اعلی کارکردگی۔
-
درست آپریشن کے لیے ایک گارنٹی کی ضرورت ہوتی ہے کہ سنگلٹن آبجیکٹ کو بغیر کسی غلطی کے شروع کیا جائے۔ دوسری صورت میں، getInstance کے طریقہ کار پر پہلی کال کا نتیجہ ExceptionInInitializerError ہو گا ، اور اس کے بعد کی تمام کالیں NoClassDefFoundError پیدا کریں گی ۔
عمل درآمد | سست آغاز | دھاگے کی حفاظت | ملٹی تھریڈ کارکردگی | کب استعمال کریں؟ |
---|---|---|---|---|
سادہ | - | + | تیز | کبھی نہیں۔ یا ممکنہ طور پر جب سست آغاز اہم نہیں ہے۔ لیکن کبھی بھی بہتر نہیں ہوگا۔ |
سست آغاز | + | - | قابل اطلاق نہیں۔ | ہمیشہ جب ملٹی تھریڈنگ کی ضرورت نہ ہو۔ |
مطابقت پذیر رسائی | + | + | سست | کبھی نہیں۔ یا ممکنہ طور پر جب ملٹی تھریڈ کارکردگی سے کوئی فرق نہیں پڑتا ہے۔ لیکن کبھی بھی بہتر نہیں ہوگا۔ |
ڈبل چیک شدہ لاکنگ | + | + | تیز | غیر معمولی معاملات میں جب آپ کو سنگلٹن بناتے وقت مستثنیات کو سنبھالنے کی ضرورت ہوتی ہے (جب کلاس ہولڈر سنگلٹن لاگو نہیں ہوتا ہے) |
کلاس ہولڈر | + | + | تیز | جب بھی ملٹی تھریڈنگ کی ضرورت ہوتی ہے اور اس بات کی گارنٹی ہوتی ہے کہ سنگلٹن آبجیکٹ بغیر کسی پریشانی کے بن جائے گا۔ |
سنگلٹن پیٹرن کے فوائد اور نقصانات
عام طور پر، سنگلٹن بالکل وہی کرتا ہے جس کی اس سے توقع کی جاتی ہے:-
یہ ضمانت دیتا ہے کہ کلاس کی صرف ایک ہی مثال ہوگی۔
-
یہ اس مثال تک عالمی رسائی کا ایک نقطہ فراہم کرتا ہے۔
-
سنگلٹن واحد ذمہ داری کے اصول کی خلاف ورزی کرتا ہے: اپنے براہ راست فرائض کے علاوہ، سنگلٹن کلاس مثالوں کی تعداد کو بھی کنٹرول کرتی ہے۔
-
ایک عام طبقے کا سنگلٹن پر انحصار کلاس کے پبلک کنٹریکٹ میں نظر نہیں آتا۔
-
عالمی متغیرات خراب ہیں۔ بالآخر، سنگلٹن ایک بھاری عالمی متغیر میں بدل جاتا ہے۔
-
سنگلٹن کی موجودگی مجموعی طور پر ایپلی کیشن اور خاص طور پر سنگلٹن کو استعمال کرنے والی کلاسوں کی قابلیت کو کم کرتی ہے۔
GO TO FULL VERSION