JavaRush /جاوا بلاگ /Random-UR /جاوا میں اپنی تشریحات بنانا
angelina
سطح

جاوا میں اپنی تشریحات بنانا

گروپ میں شائع ہوا۔
مضمون از Jonny Hackett July 14, 2014 11:09 am اگر آپ جاوا میں پروگرام کرتے ہیں اور کسی بھی مشہور فریم ورک جیسے Spring اور Hibernate کو استعمال کرتے ہیں ، تو آپ تشریحات کے استعمال سے پہلے ہی واقف ہیں۔ موجودہ فریم ورک کے ساتھ کام کرتے وقت، اندرونی تشریحات کافی ہوتی ہیں۔ لیکن اگر آپ کو اپنی تشریحات بنانے کی ضرورت ہو تو کیا ہوگا؟ کچھ عرصہ پہلے میرے پاس ایک ایسے پروجیکٹ کے لیے اپنی تشریحات بنانے کی ایک وجہ تھی جس کے لیے متعدد ڈیٹا بیس سے عام معلومات کی تصدیق کی ضرورت تھی۔ منظر نامہ ایک کاروبار کے پاس متعدد ڈیٹا بیس تھے جو ایک ہی معلومات کو محفوظ کرتے تھے اور ڈیٹا کو مختلف طریقوں سے اپ ڈیٹ کرتے تھے۔ مختلف ذرائع سے ڈیٹا حاصل کرنے سے متعلق مسائل کو ختم کرنے کے لیے ڈیٹا کو ایک ماسٹر ڈیٹا بیس میں یکجا کرنے کا منصوبہ بنایا گیا تھا۔ لیکن پراجیکٹ شروع کرنے سے پہلے، یہ جاننا ضروری تھا کہ ڈیٹا کی مطابقت پذیری کیسی ہے اور ضروری تبدیلیاں کی جائیں۔ پہلا قدم ایک رپورٹ بنانا تھا جو مختلف ڈیٹا بیس میں ایک ہی ڈیٹا کو دکھائے اور اقدار کی تصدیق کرے، یا ان ریکارڈوں کو نمایاں کرے جو میل نہیں کھاتے، قائم کردہ مصالحتی قوانین کی بنیاد پر۔ ذیل میں پروجیکٹ کے وقت کی اہم ضروریات کا ایک اقتباس ہے: • ایک ہی ڈیٹا کو تلاش کرنے کے لیے متعدد ڈیٹا بیس میں ڈیٹا کا موازنہ کریں، جیسے کہ گاہک کا نام، کمپنی کا نام یا ڈائریکٹری معلومات۔ • ڈیفالٹ کے لحاظ سے، ڈیٹا کی قسم کی بنیاد پر تمام ڈیٹا بیس میں قدر بالکل یکساں ہونی چاہیے۔ • کچھ فیلڈز کے لیے ہم صرف یہ دکھانا چاہتے تھے کہ قدر مل گئی، لیکن قدر کا موازنہ نہیں کیا گیا۔ • دیگر شعبوں کے لیے، ہم صرف اس قدر کا موازنہ کرنا چاہتے ہیں جو پایا گیا اور ڈیٹا کی تصدیق مخصوص ذریعہ سے ڈیٹا کے ساتھ کریں۔ • تیسرے فیلڈز کے لیے، ہم ڈیٹا کا ایک پیچیدہ موازنہ کرنا چاہتے تھے جو ریکارڈ کے اندر موجود دیگر فیلڈز کی قدر پر مبنی ہو۔ • چوتھی فیلڈ قسم کے لیے، ہم ڈیٹا کو فارمیٹ کرنا چاہتے تھے، مثال کے طور پر کرنسی کی شکل میں $000,000.00۔ • رپورٹ MS Excel فارمیٹ میں ہونی چاہیے، ہر قطار میں ایک الگ ماخذ سے ایک قدر ہونی چاہیے۔ کوئی بھی سطر جس کی قدر ڈیٹا کی تصدیق کی شرائط سے میل نہیں کھاتی اسے پیلے رنگ میں نمایاں کیا جانا چاہیے۔ تشریحات جب ہم نے تقاضوں کو پڑھ لیا اور جس چیز کی ضرورت تھی اس کے لیے کچھ مختلف آئیڈیاز سامنے آئے، میں نے ان تشریحات کو استعمال کرنے کا فیصلہ کیا جو ڈیٹا کے موازنہ کی ترتیب اور رپورٹنگ کے عمل کو متحرک کریں گے۔ ہمیں ایک سادہ، ابھی تک لچکدار اور قابل توسیع حل کی ضرورت ہے۔ یہ تشریحات فیلڈ لیول پر ہوں گی اور مجھے یہ حقیقت پسند ہے کہ کلاس پاتھ پر کسی فائل میں کنفیگریشن نہیں چھپے گی۔ اس کے بجائے، میں فیلڈ سے وابستہ تشریحات دیکھ سکوں گا تاکہ مجھے بخوبی معلوم ہو کہ اس پر کیسے عمل کیا جائے گا۔ سیدھے الفاظ میں، ایک تشریح ایک مارکر، میٹا ڈیٹا سے زیادہ کچھ نہیں ہوگی جو معلومات فراہم کرے گا، لیکن خود کوڈ کے عمل کو براہ راست متاثر نہیں کرے گا۔ اگر آپ پہلے جاوا میں پروگرام کر چکے ہیں، تو آپ کو تشریحات کے استعمال سے واقف ہونا چاہیے، لیکن ہو سکتا ہے کہ آپ کو اپنی تخلیق کرنے کی کبھی ضرورت نہ پڑے۔ ایسا کرنے کے لیے، آپ کو ایک نئی قسم بنانے کی ضرورت ہے جو Java @interface type استعمال کرے ، جس میں ایسے عناصر ہوں گے جو بدلے میں میٹا ڈیٹا کی تفصیلات کی وضاحت کرتے ہیں۔ یہاں ایک پروجیکٹ کی ایک مثال ہے: 1@Target(ElementType.FIELD) 2@Retention(RetentionPolicy.RUNTIME) 3public @interface ReconField { 4 5 /** 6 * Значение, которое определяет из Howого источника сравниваются данные, or будет использоваться для 7 отображения значения or для ссылки на правило. 8 * 9 * @return Значение, если источники должны быть сравнены, по умолчанию true. 10 */ 11 boolean compareSources() default true; 12 13 /** 14 * Значение показывает формат, который используется для отображения значения в отчете. 15 * 16 * @return Установленный формам, по умолчанию native. 17 */ 18 ReconDisplayFormat displayFormat() default ReconDisplayFormat.NATIVE; 19 20 /** 21 * Значение, показывающее meaning ID используемого поля для одинаковых значений из источника до поля. 22 * 23 * @return ID поля. 24 */ 25 String id(); 26 27 /** 28 * Значение, показывающее ярлык, который будет отображается в отчете для поля. 29 * 30 * @return Значение ярлыка, по умолчанию пустая строка. 31 */ 32 String label() default ""; 33 34 /** 35 * Значение, показывающее источник, который должен быть сравнен на предмет различий. 36 * 37 * @return Список источников для сравнения. 38 */ 39 ReconSource[] sourcesToCompare() default {}; 40 } یہ بنیادی تشریح ہے جس کے ساتھ ڈیٹا کے موازنہ کا عمل شروع کرنا ہے۔ اس میں بنیادی مطلوبہ عناصر شامل ہیں، جیسا کہ ضرورت ہے، مختلف ڈیٹا ذرائع سے ڈیٹا کا موازنہ کرنے کے لیے۔ @ReconField کو زیادہ سے زیادہ پیچیدہ ڈیٹا موازنہ کے علاوہ، جس کے بارے میں ہم بعد میں بات کریں گے، کے ساتھ، ہمیں زیادہ تر چیزوں کو سنبھالنا چاہیے۔ ان عناصر میں سے زیادہ تر کوڈ میں تبصروں کے ذریعے بیان کیا گیا ہے۔ قطع نظر، ہمارے @ReconField میں چند اہم تشریحات کو الگ سے بیان کرنے کی ضرورت ہے۔ • @Target - یہ تشریح آپ کو ان جاوا عناصر کی وضاحت کرنے کی اجازت دے گی جن پر تشریح کو لاگو کیا جانا چاہیے۔ استعمال کرنے کے لیے ممکنہ اقسام ہیں: ANNOTATION_TYPE، CONSTRUCTOR، FIELD، LOCAL_VARIABLE، METHOD، PACKAGE، PARAMETER اور TYPE۔ FIELD سطح کے لیے ہمارے @ReconField تشریح میں۔ @Retention - یہ تشریح آپ کو یہ بتانے کی اجازت دے گی کہ تشریح کب دستیاب ہوگی۔ ممکنہ قدریں CLASS، RUNTIME اور SOURCE ہیں۔ چونکہ ہم RUNTIME میں تشریحات پر کارروائی کریں گے، ہمیں ان اقدار کو سیٹ کرنا چاہیے۔ ڈیٹا کی توثیق کا عمل ہر ڈیٹا بیس کے خلاف ایک سوال چلائے گا، اور پھر نتائج کو مجموعی ڈیٹا میں ظاہر کرے گا، جو کہ کسی خاص ریکارڈ کی قسم کے لیے تمام فیلڈز ہیں۔ مشترکہ ڈیٹا میں ہر فیلڈ کے لیے ایک تشریح پروسیسر کو بتائے گی کہ اس مخصوص فیلڈ کے لیے ڈیٹا کا موازنہ کیسے کیا جائے، نیز ہر ڈیٹا بیس میں پائی جانے والی قدر۔ آئیے چند مثالوں کو دیکھتے ہیں کہ ان تشریحات کو ڈیٹا کے مختلف موازنہ کنفیگریشنز کے لیے کیسے استعمال کیا جا سکتا ہے۔ اس بات کی تصدیق کرنے کے لیے کہ ایک قدر موجود ہے اور ہر ڈیٹا سورس میں بالکل مماثل ہے، آپ کو صرف ایک فیلڈ ID اور ایک لیبل فراہم کرنے کی ضرورت ہے جو رپورٹ کے خانے میں ظاہر ہوگا۔ 1 @ReconField(id = CUSTOMER_ID, label = "Customer ID") 2 private String customerId; ہر ڈیٹا سورس سے پائی جانے والی قدروں کو ظاہر کرنے کے لیے، لیکن ڈیٹا کا موازنہ کرنے کے لیے، آپ کو compareSources کا عنصر بتانا ہوگا اور ویلیو کو غلط پر سیٹ کرنا ہوگا۔ 1 @ReconField(id = NAME, label = "NAME", compareSources = false) 2 private String name; اس بات کی تصدیق کرنے کے لیے کہ ایک قدر کسی مخصوص ڈیٹا سورس میں پائی جاتی ہے، لیکن تمام نہیں، آپ کو SourceToCompare عنصر استعمال کرنے کی ضرورت ہے ۔ یہ تمام پائی جانے والی اقدار کو ظاہر کرے گا، لیکن ڈیٹا کے ذرائع میں کسی بھی ڈیٹا کا موازنہ عناصر کی فہرست کے مطابق کیا جائے گا۔ یہ اس صورت میں ہے اگر کچھ ڈیٹا تمام ڈیٹا ذرائع میں محفوظ نہیں کیا جاتا ہے۔ ReconSource ایک اینوم ہے جس میں ڈیٹا کے ذرائع موازنہ کے لیے دستیاب ہیں۔ 1 @ReconField(id = PRIVATE_PLACEMENT_FLAG, label = "PRIVATE PLACEMENT FLAG", sourcesToCompare ={ 2 ReconSource.LEGACY, ReconSource.PACE }) private String privatePlacementFlag; اب جب کہ ہم نے بنیادی تقاضے پورے کر لیے ہیں، ہمیں زیادہ پیچیدہ ڈیٹا موازنہ کرنے کی ضرورت ہے جو فیلڈ کے لیے مخصوص ہیں۔ ایسا کرنے کے لیے ہم ایک دوسری تشریح بنائیں گے جو قواعد کی کارروائی کو متحرک کرے گی۔ 1 @Target(ElementType.FIELD) 2 @Retention(RetentionPolicy.RUNTIME) 3 public @interface ReconCustomRule { 4 5 /** 6 * Значение, указывающее используемые параметры, прописанные обработчику правила, meaning по умолчанию - 7 отсутствие параметров. 8 * 9 * @return The String[] параметры, прописанные обработчику правила 10 */ 11 String[] params() default {}; 12 13 /** 14 * Значение, указывающее класс обработчика правила, которое используется для сравнения значений из 15 каждого источника данных. 16 * 17 * @return Класс обработчика правила 18 */ 19 Class processor() default DefaultReconRule.class; 20 } پچھلی تشریح سے بہت ملتی جلتی ہے، ایک بڑا فرق یہ ہے کہ @ReconCustomRule میں ہم ایک ایسی کلاس بتاتے ہیں جو ڈیٹا کا موازنہ چلائے گا جب ریکن کا عمل شروع ہوگا۔ آپ صرف اس کلاس کی وضاحت کر سکتے ہیں جو استعمال کی جائے گی، تاکہ آپ کا ہینڈلر ایک قدر تفویض کرے اور جو بھی کلاس آپ بیان کریں اسے شروع کرے۔ اس تشریح میں مخصوص کلاس قاعدہ انٹرفیس کا استعمال کرے گی، جس کے نتیجے میں ہینڈلر اصول کو انجام دینے کے لیے استعمال کرے گا۔ آئیے اس تشریح کی چند مثالیں دیکھتے ہیں۔ اس مثال میں، ہم ایک اصول استعمال کر رہے ہیں جو غیر امریکی کرنسی کے تبادلے کی جانچ کرے گا اور اس معاملے میں ڈیٹا کے موازنہ کو چھوڑ دے گا۔ ایسا کرنے کے لیے، ہمیں اسی ریکارڈ میں ملکی فیلڈ کو چیک کرنے کی ضرورت ہے۔ 1 @ReconField(id = STREET_CUSIP, label = "STREET CUSIP", compareSources = false) 2 @ReconCustomRule(processor = SkipNonUSExchangeComparisonRule.class) 3 private String streetCusip; یہاں ایک مثال ہے جس میں ہم اصول کے پیرامیٹرز مرتب کرتے ہیں، اس معاملے میں رواداری کی قدر۔ ہمارے ڈیٹا کا موازنہ کرنے کے لیے، موازنہ کی قدر 1,000 سے زیادہ نہیں ہٹ سکتی۔ رواداری کی قدر کو متعین کرنے کے لیے پیرامیٹر کا استعمال ہمیں مختلف شعبوں کے لیے مختلف رواداری کی قدروں کے ساتھ ایک جیسے اصول استعمال کرنے کی اجازت دے گا۔ صرف مسئلہ یہ ہے کہ یہ پیرامیٹرز جامد ہیں اور تشریح کی نوعیت کی وجہ سے متحرک نہیں ہو سکتے۔ 1 @ReconField(id = USD_MKT_CAP, label = "MARKET CAP USD", displayFormat = 2 ReconDisplayFormat.NUMERIC_WHOLE, sourcesToCompare = 3 { ReconSource.LEGACY, ReconSource.PACE, ReconSource.BOB_PRCM }) 4 @ReconCustomRule(processor = ToleranceAmountRule.class, params = { "10000" }) 5 private BigDecimal usdMktCap; جیسا کہ آپ دیکھ سکتے ہیں، ہم نے دو کافی آسان تشریحات کا استعمال کرکے مختلف ڈیٹا بیس سے ڈیٹا کا موازنہ کرنے کے عمل میں کچھ لچک شامل کی ہے۔ اس خاص معاملے کے لیے، تشریحات ڈیٹا کے موازنہ کے عمل کو چلاتے ہیں، تاکہ بنیادی طور پر ہم مشترکہ ڈیٹا میں پائے جانے والے تشریحات کا جائزہ لیں اور ان کا استعمال پروسیسنگ کی رہنمائی کے لیے کریں۔ نتیجہ جاوا میں تشریحات پر بہت سے مضامین ہیں، وہ کیا کرتے ہیں اور ان کے استعمال کے اصول کیا ہیں۔ اس مضمون میں میں مثالوں کے ذریعے یہ بتانا چاہتا تھا کہ آپ ان کو کیوں استعمال کریں اور اس سے آپ کو کیا فوائد حاصل ہو سکتے ہیں۔ براہ کرم نوٹ کریں کہ یہ صرف شروعات ہے۔ ایک بار جب آپ تشریحات بنانے کا فیصلہ کر لیتے ہیں، تو آپ کو یہ معلوم کرنا پڑے گا کہ انہیں سب سے مؤثر طریقے سے کیسے استعمال کیا جائے۔ حصہ 2 میں، میں آپ کو دکھاؤں گا کہ جاوا ریفلیکشن کا استعمال کرتے ہوئے تشریحات پر کیسے عمل کیا جائے۔ — جونی ہیکیٹ، asktheteam@keyholesoftware.com اصل مضمون http://www.javacodegeeks.com/2014/07/creating-your-own-java-annotations.html
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION