آج ہم سٹرنگ کی گنتی کے ساتھ کام کرنے کے بارے میں بات کریں گے، اور خاص طور پر، ایسی
enum
کلاسوں کے ساتھ جو سٹرنگ کنسٹینٹس کے ساتھ تعامل کو منظم کرتی ہیں۔
سٹرنگ شماریات کا استعمال
ایپلیکیشن ڈویلپمنٹ کے دوران، آپ کو وقتاً فوقتاً اسٹرنگ ویلیوز کے ایک مقررہ سیٹ پر کام کرنے کی ضرورت ہوتی ہے۔ یہ کچھ بھی ہو سکتا ہے۔ مثال کے طور پر، ایپلیکیشن کے ذریعے تعاون یافتہ رنگین کوڈز کی فہرست، یا ان آلات کی فہرست جن کے ساتھ ہماری ایپلیکیشن تعامل کر سکتی ہے، موسم وغیرہ۔ یہ سب ایک مشترکہ ڈھانچہ کے ساتھ سٹرنگ کنسٹینٹس کا پہلے سے طے شدہ سیٹ ہے، جس کے ساتھ جاوا کوڈ کی سطح پر پروگرام کا تعامل قائم کرنا ضروری ہے۔ جب آپ کو پہلے سے طے شدہ سٹرنگ (اور دیگر) مستقل سیٹ کے ساتھ تعامل کرنے کی ضرورت ہو تو، بہترین حل یہ ہے کہ آپ اپنیenum
کلاس لکھیں۔ enum
ذیل میں ہم میں تبدیلی کی مثالیں دیکھیں گے string
۔
سٹرنگ کی گنتی بنانا
آئیےenum
ایک ایسی کلاس بنائیں جو ایپلیکیشن کی تعیناتی کے لیے مختلف ماحول کی فہرست کے ساتھ ساتھ ہر ماحول کے URL کو اسٹور کرے:
public enum Environment {
PROD("https://release.application.com/"),
TEST("https://test.application.com/"),
AUTO_TEST("https://autotest.application.com/"),
DEV("http://localhost:8080");
private final String url;
Environment(String url) {
this.url = url;
}
public String getUrl() {
return url;
}
}
اس کلاس میں ہم نے 4 ماحول کی وضاحت کی ہے:
PROD
- رہائیTEST
- دستی جانچ کے لیےAUTO_TEST
- آٹو ٹیسٹس کے لیے ماحولDEV
- ترقی اور ڈیبگنگ کے لیے مقامی
enum
ہر یو آر ایل ہماری گنتی میں ایک سٹرنگ مستقل ہوتا ہے: ان کی وضاحت ہر مستقل کے آگے قوسین میں ہوتی ہے ۔- ایک کنسٹرکٹر ہونا ضروری ہے جو ہر ایک
enum
مستقل کی طرح ایک ہی قسم کی دلیل لیتا ہے۔ - کنسٹرکٹر کا دائرہ کار
private
یا تو ہےpackage private
۔ - متغیر کی وضاحت کرنا ضروری ہے - ایک کلاس فیلڈ جو اسٹرنگ کنسٹینٹس کو محفوظ کرے گا جو ہم نے بیان کیے ہیں۔ آپ کو اس فیلڈ کے لیے ایک گیٹر طریقہ بنانا چاہیے تاکہ سٹرنگ کنسٹینٹس کی قدروں کو بیرونی طور پر استعمال کیا جا سکے۔
سٹرنگ کی گنتی پر تکرار کرنا
اس مرحلے پر، ہم پہلے سے ہی تمام دستیابenum
اقدار پر اعادہ کر سکتے ہیں، اور ساتھ ہی ان کے ساتھ جڑے ہوئے سٹرنگ کنسٹنٹ بھی حاصل کر سکتے ہیں۔ کسی بھی کلاس کی تمام اقدار حاصل کرنے کے لیے enum
، آپ کو طریقہ استعمال کرنا ہوگا values()
:
public class Main {
public static void main(String[] args) {
for (Environment env : Environment.values()) {
System.out.println(env + " : " + env.getUrl());
}
}
}
نتیجہ:
PROD : https://release.application.com/
TEST : https://test.application.com/
AUTO_TEST : https://autotest.application.com/
DEV : http://localhost:8080
جیسا کہ مثال سے دیکھا جا سکتا ہے، enum
مستقل کا نام پرنٹ کرنے کے لیے، ہم نے اسے طریقہ پر منتقل کیا System.out.println
، اور اس مستقل سے وابستہ یو آر ایل کو پرنٹ کرنے کے لیے، ہم نے جس گیٹر کی وضاحت کی ہے اسے استعمال کیا۔
enum سے سٹرنگ مستقل حاصل کرنا
کسی بھی سٹرنگ کنسٹینٹ کی ویلیو حاصل کرنے کے لیے، ہم کسی بھیenum
مستقل پر گیٹر کو بھی کال کر سکتے ہیں۔
public class Main {
public static void main(String[] args) {
String prodUrl = Environment.PROD.getUrl();
String devUrl = Environment.DEV.getUrl();
System.out.println("Production url is: " + prodUrl);
System.out.println("Development url is: " + devUrl);
}
}
نتیجہ:
Production url is: https://release.application.com/
Development url is: http://localhost:8080
نام سے مسلسل enum حاصل کرنا
enum
بعض اوقات اس کے اسٹرنگ نام سے مستقل حاصل کرنا ضروری ہوتا ہے ۔ یہ طریقہ استعمال کرتے ہوئے کیا جاتا ہے valueOf(String)
، جو اس کے نام سے ایک مستقل لوٹاتا ہے:
public class Main {
public static void main(String[] args) {
Environment prod = Environment.valueOf("PROD");
Environment dev = Environment.valueOf("DEV");
System.out.println("Production url is: " + prod.getUrl());
System.out.println("Development url is: " + dev.getUrl());
}
}
نتیجہ:
Production url is: https://release.application.com/
Development url is: http://localhost:8080
لیکن یہاں احتیاط کی ضرورت ہے۔ اگر طریقہ enum
مخصوص نام کے ساتھ مستقل نہیں ملتا ہے تو، ایک استثناء پھینک دیا جائے گا java.lang.IllegalArgumentException
.
سٹرنگ کو Enum میں تبدیل کرنا
کبھی کبھی اس کے برعکس ضرورت پیش آتی ہے۔ قدر کو جانتے ہوئےenum
، enum
مستقل خود حاصل کریں۔ وہ. ہماری مثال میں، کسی مخصوص پتہ کو جانتے ہوئے، آپ کو متعلقہ Environment
مستقل حاصل کرنے کی ضرورت ہے۔ ایسا کرنے کے کئی اختیارات ہیں۔ اور ان سب کو enum
کلاس میں ہی بہتری کی ضرورت ہے۔ آپشن 1۔ کلاس کے اندر گنتی۔ آپ کو ایک ایسا طریقہ بنانے کی ضرورت ہے جو اسٹرنگ کو قبول کرے اور enum
کلاس کی تمام اقدار کے ساتھ اس کا موازنہ کرے۔ اگر کوئی مماثلت ہے، تو طریقہ مطلوبہ گنتی واپس کر دے گا۔ ہماری مثال کے طور پر، ہمیں Environment
کلاس کے اندر درج ذیل طریقہ بنانے کی ضرورت ہے:
public static Environment getEnvByUrl(String url) {
for (Environment env : values()) {
// либо equalsIgnoreCase, на ваше усмотрение
if (env.getUrl().equals(url)) {
return env;
}
}
// Либо просто вернуть null
throw new IllegalArgumentException("No enum found with url: [" + url + "]");
}
پھر ہم enum
سٹرنگ سے اس طرح حاصل کر سکتے ہیں:
public class Main {
public static void main(String[] args) {
String url = "http://localhost:8080";
Environment env = Environment.getEnvByUrl(url);
System.out.println("Environment name for url=[" + url + "] is: " + env);
}
}
نتیجہ:
Environment name for url=[http://localhost:8080] is: DEV
اس نقطہ نظر کے اپنے منفی پہلو ہیں۔ ہر بار، enum
ایک مستقل حاصل کرنے کے لیے، آپ کو تمام اقدار کے ذریعے اعادہ کرنا پڑے گا اور ایک خاص تعداد میں موازنہ کرنا پڑے گا۔ اس معاملے میں کارکردگی کا جرمانہ مستقل کی تعداد اور اسی طرح کی کارروائیوں کی تعداد سے طے کیا جائے گا۔ اس مسئلے کو حل کرنے کا دوسرا طریقہ یہ مسئلہ نہیں ہے۔ مکمل Enum
کلاس کوڈ:
public enum Environment {
PROD("https://release.application.com/"),
TEST("https://test.application.com/"),
AUTO_TEST("https://autotest.application.com/"),
DEV("http://localhost:8080");
private final String url;
Environment(String url) {
this.url = url;
}
public String getUrl() {
return url;
}
public static Environment getEnvByUrl(String url) {
for (Environment env : values()) {
if (env.getUrl().equals(url)) {
return env;
}
}
throw new IllegalArgumentException("No enum found with url: [" + url + "]");
}
}
آپشن 2: استعمال HashMap
اس معاملے میں، ہم اپنے اینوم کے اندر ایک نقشہ بناتے ہیں اور اسے مرتب کرنے کے وقت ایک بار آباد کرتے ہیں، اور پھر اس سے قدریں لیتے ہیں:
public enum Environment {
PROD("https://release.application.com/"),
TEST("https://test.application.com/"),
AUTO_TEST("https://autotest.application.com/"),
DEV("http://localhost:8080");
private final String url;
Environment(String url) {
this.url = url;
}
public String getUrl() {
return url;
}
// Создаем static final карту
private static final Map<String, Environment> LOOKUP_MAP = new HashMap<>();
// Заполняем её всеми значениями
static {
for (Environment env : values()) {
LOOKUP_MAP.put(env.getUrl(), env);
}
}
// Возвращаем Environment по строковому url
public static Environment getEnvByUrl(String url) {
return LOOKUP_MAP.get(url);
}
}
استعمال کے لحاظ سے، دونوں اختیارات ایک جیسے ہیں:
public class Main {
public static void main(String[] args) {
String url = "http://localhost:8080";
Environment env = Environment.getEnvByUrl(url);
System.out.println("Environment name for url=[" + url + "] is: " + env);
}
}
نتیجہ:
Environment name for url=[http://localhost:8080] is: DEV
لیکن اس طریقہ کار کے بھی نقصانات ہیں۔ سب سے پہلے، بہت زیادہ کوڈ ہے. اور دوسری بات یہ کہ HashMap
تمام enum
ویلیوز ایپلی کیشن میموری میں مستقل طور پر محفوظ ہو جائیں گی۔ جیسا کہ آپ دیکھ سکتے ہیں، ہر چیز کے فوائد اور نقصانات ہیں. لیکن یہ دیکھتے ہوئے کہ enum
کلاسیں عام طور پر اتنی قدریں ذخیرہ نہیں کرتی ہیں، اس کے نقصانات تقریباً قابل توجہ نہیں ہوں گے۔ ایک انتباہ ہے: اگر ایسا آپریشن (اسٹرنگ ویلیو کے ذریعے جاوا اینم حاصل کرنا) کثرت سے کیا جاتا ہے، تو بہتر ہے کہ دوسرا آپشن استعمال کریں۔ Enum
آپ JavaRush کورس میں اس موضوع اور عمومی طور پر کلاسز کے بارے میں مزید جان سکتے ہیں۔ طلباء پانچویں سطح کے پہلے لیکچرEnum
میں پہلے ہی جاوا رش سیکھتے ہیں ۔
GO TO FULL VERSION