JavaRush /جاوا بلاگ /Random-SD /جاوا ۾ پنهنجا پنهنجا تشريحون ٺاهڻ
angelina
سطح

جاوا ۾ پنهنجا پنهنجا تشريحون ٺاهڻ

گروپ ۾ شايع ٿيل
آرٽيڪل پاران Jonny Hackett 14 جولاءِ 2014 11:09 am جيڪڏهن توهان جاوا ۾ پروگرام ڪريو ٿا ۽ ڪنهن به مشهور فريم ورڪ جهڙوڪ اسپرنگ ۽ هائيبرنيٽ استعمال ڪريو ٿا ، ته پوءِ توهان اڳ ۾ ئي تشريح جي استعمال کان واقف آهيو. جڏهن موجوده فريم ورڪ سان ڪم ڪري رهيا آهيو، اندروني تشريحون ڪافي آهن. پر ڇا جيڪڏهن توهان کي پنهنجي تشريح ٺاهڻ جي ضرورت آهي؟ گهڻو وقت اڳ مون وٽ هڪ منصوبي لاءِ پنهنجون تشريحون ٺاهڻ جو هڪ سبب هو جنهن لاءِ ڪيترن ئي ڊيٽابيس مان عام معلومات جي تصديق گهربل هئي. منظرنامو هڪ ڪاروبار وٽ ڪيترائي ڊيٽابيس هئا جيڪي ساڳي معلومات کي محفوظ ڪندا هئا ۽ ڊيٽا کي مختلف طريقن سان اپڊيٽ ڪندا هئا. مختلف ذريعن کان ڊيٽا حاصل ڪرڻ سان لاڳاپيل مسئلن کي ختم ڪرڻ لاء ڊيٽا کي هڪ ماسٽر ڊيٽابيس ۾ گڏ ڪرڻ جي منصوبابندي ڪئي وئي. پر پروجيڪٽ شروع ڪرڻ کان پهريان، اهو معلوم ڪرڻ ضروري هو ته ڊيٽا ڪيئن هم وقت سازي کان ٻاهر هئي ۽ ضروري تبديليون ڪيون. پهريون قدم هڪ رپورٽ ٺاهڻ هو جيڪو مختلف ڊيٽابيس ۾ ساڳيو ڊيٽا ڏيکاريندو ۽ قدرن جي تصديق ڪندو، يا انهن رڪارڊن کي نمايان ڪندو جيڪي نه ٺهيا هئا، قائم ڪيل مصالحتي ضابطن جي بنياد تي. هيٺ پروجيڪٽ جي وقت جي بنيادي ضرورتن جو هڪ اقتباس آهي: • ساڳئي ڊيٽا ڳولڻ لاءِ ڪيترن ئي ڊيٽابيس ۾ ڊيٽا جو موازنہ ڪريو، جهڙوڪ ڪسٽمر جو نالو، ڪمپني جو نالو يا ڊاريڪٽري جي معلومات. • ڊفالٽ طور، ڊيٽا جي قسم جي بنياد تي سڀني ڊيٽابيس ۾ قيمت بلڪل ساڳي هجڻ گهرجي. • ڪجهه شعبن لاءِ اسان صرف اهو ڏيکارڻ چاهيون ٿا ته قيمت ملي آهي، پر قيمت جي مقابلي ۾ نه هئي. • ٻين شعبن لاءِ، اسان صرف ان قدر جو مقابلو ڪرڻ چاهيون ٿا جيڪو مليو آهي ۽ ڊيٽا جي تصديق ڪيل ماخذ کان ڊيٽا سان. • ٽئين شعبن لاءِ، اسان چاهيون ٿا هڪ پيچيده ڊيٽا جو مقابلو جيڪو رڪارڊ جي ٻين شعبن جي قدر تي ٻڌل هجي. • چوٿين فيلڊ جي قسم لاءِ، اسان ڊيٽا کي فارميٽ ڪرڻ چاهيون ٿا، مثال طور ڪرنسي فارميٽ ۾ $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