জাভাতে টীকাগুলি বাড়ানো কেন সম্ভব নয়?


227

জাভা টীকাগুলিতে কেন জাভা ক্লাসগুলির মতো কোনও উত্তরাধিকার নেই তা আমি বুঝতে পারি না। আমি মনে করি এটি খুব দরকারী হবে।

উদাহরণস্বরূপ: আমি জানতে চাই যে প্রদত্ত টিকাটি কোনও বৈধতা প্রদানকারী। উত্তরাধিকারের সাথে, আমি এই টীকাটি a প্রসারিত করে কিনা তা জানতে আমি রিফ্লেসিভলি সুপার ক্লাসের মাধ্যমে নেভিগেট করতে পারি ValidatorAnnotation। না হলে আমি কীভাবে এটি অর্জন করতে পারি?

সুতরাং, কেউ কি আমাকে এই ডিজাইনের সিদ্ধান্তের জন্য কোনও কারণ দিতে পারেন?


2
দ্রষ্টব্য, বিটিডাব্লু, যে সমস্ত টীকা প্রসারিত হয় java.lang.annotation.Annotation, অর্থাত্ কোনও টীকাটি হ'ল instanceofযদিও এই সত্যটি স্পষ্টভাবে ঘোষণা করা হয়নি।
টোম জুলুসকি

উত্তর:


166

এটি কেন এমনভাবে ডিজাইন করা হয়নি তার কারণ সম্পর্কে আপনি জেএসআর 175 ডিজাইন এফকিউতে উত্তর সন্ধান করতে পারেন , যেখানে এটি বলে:

আপনি কেন টীকা সাবটিপিং সমর্থন করেন না (যেখানে একটি টীকা ধরণের আরেকটি প্রসারিত হয়)?

এটি এনোটেশন টাইপ সিস্টেমকে জটিল করে তোলে এবং "নির্দিষ্ট সরঞ্জামগুলি" লেখা আরও জটিল করে তোলে।

...

"সুনির্দিষ্ট সরঞ্জাম" - এমন প্রোগ্রাম যা স্বেচ্ছাসেবী বাহ্যিক প্রোগ্রামগুলির এনটোটেশন প্রকারের কোয়েরি করে। স্টাব জেনারেটর, উদাহরণস্বরূপ, এই বিভাগে পড়ে। এই প্রোগ্রামগুলি ভার্চুয়াল মেশিনে লোড না করে এনেটেটেড ক্লাসগুলি পড়বে, তবে টীকাগুলি ইন্টারফেসগুলি লোড করবে।

সুতরাং, হ্যাঁ আমার অনুমান, কারণ এটি কেবল KISS। যাইহোক, দেখে মনে হচ্ছে এই ইস্যুটি (আরও অনেকগুলি সহ) জেএসআর 308 এর অংশ হিসাবে বিবেচনা করা হচ্ছে এবং আপনি ইতিমধ্যে ম্যাথিয়াস রিকেন দ্বারা বিকাশিত এই কার্যকারিতা সহ একটি বিকল্প সংকলকও খুঁজে পেতে পারেন ।


67
ঠিক আছে, সম্ভবত আমি বোকা, তবে আমি মনে করি এটি কেবল একটি "সরল রাখার জন্য" এর জন্য মন্তব্যটি প্রসারিত করতে পারে না a কমপক্ষে, জাভা ডিজাইনারগণ বর্গ উত্তরাধিকার সম্পর্কে একই
ভাবেননি

2
জাভা 8 এম 7, সাব-ক্লাসিং টীকাগুলিকে সমর্থন করে বলে মনে হচ্ছে না। কি করুণা।
Ceki

2
@Asslias JEP 104 সাব-ক্লাস টীকাগুলি করা সম্ভব করার বিষয়ে নয়। JEP 104 জাভা 8 এ বাস্তবায়িত হয়েছিল, তবে সাব-ক্লাস টীকাগুলি করা এখনও সম্ভব নয় (একটি টীকাতে অন্য টীকা প্রসারিত করুন)।
জেস্পার

71

এক্সটেনসিবল টীকাগুলি কার্যকরভাবে অন্য ধরণের সিস্টেম নির্দিষ্টকরণ এবং রক্ষণাবেক্ষণের বোঝা যুক্ত করবে। এবং এটি একটি মোটামুটি অনন্য টাইপ সিস্টেম হবে, সুতরাং আপনি কেবল একটি OO ধরণের দৃষ্টান্ত প্রয়োগ করতে পারেন না।

আপনি যখন কোনও টীকাতে বহুরূপীকরণ এবং উত্তরাধিকার পরিচয় করিয়ে দিন তখন সমস্ত বিষয় বিবেচনা করুন (উদাহরণস্বরূপ যখন সাব-টিকাটি মেটা-টীকাগুলি যেমন ধরে রাখার মতো পরিবর্তনগুলি পরিবর্তন করে?)

এবং এই সমস্ত যুক্ত জটিলতা কি ব্যবহারের ক্ষেত্রে?

আপনি জানতে চান যে প্রদত্ত টিকাটি কোনও বিভাগের অন্তর্ভুক্ত?

এটা চেষ্টা কর:

@Target(ElementType.ANNOTATION_TYPE)
public @interface Category {
    String category();
}

@Category(category="validator")
public @interface MyFooBarValidator {

}

যেমন আপনি দেখতে পাচ্ছেন, সরবরাহিত সুবিধা ব্যবহার করে অনায়াসে আপনি সহজেই দলবদ্ধ এবং শ্রেণিবদ্ধ করতে পারেন।

সুতরাং, জাভা ভাষার সাথে মেটা-টাইপ টাইপ সিস্টেম চালু না করার কারণ হ'ল কেআইএসএস

[পিএস সম্পাদনা]

আমি স্ট্রিংটি কেবল প্রদর্শনের জন্য এবং একটি মুক্ত সমাপ্ত মেটা টীকাটি দেখার জন্য ব্যবহার করেছি। আপনার নিজস্ব প্রদত্ত প্রকল্পের জন্য, আপনি স্পষ্টতই বিভাগের ধরণের এনাম ব্যবহার করতে পারেন এবং প্রদত্ত টীকায় একাধিক বিভাগ ("একাধিক উত্তরাধিকার") নির্দিষ্ট করতে পারেন। মনে রাখবেন যে মানগুলি সম্পূর্ণ বোগাস এবং কেবল প্রদর্শনের উদ্দেশ্যে:

@Target(ElementType.ANNOTATION_TYPE)
public @interface Category {
    AnnotationCategory[] category();
}
public enum AnnotationCategory {
    GENERAL,
    SEMANTICS,
    VALIDATION,
    ETC
}

@Category(category={AnnotationCategory.GENERAL, AnnotationCategory.SEMANTICS})
public @interface FooBarAnnotation {

}


কাজ করে না মিথ্যা মুদ্রণ করবে:@Target(ElementType.ANNOTATION_TYPE) @Retention(RetentionPolicy.RUNTIME) @interface C {}; @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @C public @interface F {} class a{ @F public void S() {} } @Test public void blahTest() throws NoSuchMethodException { Method m = a.class.getMethod("S"); System.out.println(m.isAnnotationPresent(C.class)); }
ব্যবহারকারী 1615664

আমরা একটি টীকা বর্জন করছি। একটি # এস এর এন্টারনেশন আছে এফ। এফ নিজে সি দ্বারা টীকায় আছে এটি চেষ্টা করে দেখুন।
আলফাজেরো

হ্যা ঐটা সঠিক. তবে এনটেশন প্রক্সি পড়ার চেয়ে আরও পরিষ্কারভাবে এটি করার কোনও উপায় আছে কি?
ব্যবহারকারী 1615664

12

এক অর্থে আপনার কাছে ইতিমধ্যে টিকা - মেটা টিকা রয়েছে। আপনি যদি মেটা তথ্যের সাথে কোনও টিকাটি টীকায় টানেন তবে এটি বিভিন্ন উপায়ে অতিরিক্ত ইন্টারফেস বাড়ানোর সমতুল্য। টীকাগুলি হ'ল ইন্টারফেস, সুতরাং বহুবর্ষটি সত্যই কার্যকর হয় না এবং যেহেতু এগুলি প্রকৃতির স্থির হয় তাই কোনও রানটাইম গতিশীল প্রেরণ হতে পারে না।

আপনার বৈধকরণকারীর উদাহরণে, আপনি কেবল টীকাতে টীকায়িত টাইপ পেতে পারেন এবং দেখুন এটিতে কোনও বৈধকারীর মেটা-টিকা রয়েছে।

একমাত্র ব্যবহারের ক্ষেত্রে আমি দেখতে পেলাম যে উত্তরাধিকার সাহায্য করবে যদি আপনি সুপার টাইপ অনুসারে টিকা পেতে সক্ষম হন তবে এটি সম্পূর্ণ জটিলতা যুক্ত করে দেবে, কারণ একটি প্রদত্ত পদ্ধতি বা প্রকারের এ জাতীয় দুটি টিকা থাকতে পারে, এর অর্থ যে কেবল একটি একক বস্তুর পরিবর্তে একটি অ্যারে ফিরতে হবে।

সুতরাং আমি মনে করি চূড়ান্ত উত্তরটি হ'ল ব্যবহারের কেসগুলি গৌরবময় এবং আরও স্ট্যান্ডার্ড ব্যবহারের কেসগুলির পক্ষে এটির পক্ষে উপযুক্ত নয় complic


5

জাভা এনোটোটেশন সমর্থনের ডিজাইনাররা জাভা সম্প্রদায়ের ক্ষয়ক্ষতির জন্য বেশ কয়েকটি "সরলীকরণ" করেছিলেন।

  1. কোনও টিকা নেই সাব-টাইপগুলি অনেকগুলি জটিল টীকা অহেতুক কুৎসিত করে। তিনটি জিনিসের মধ্যে একটিকে ধরে রাখতে পারে এমন কোনও টিকাটির মধ্যে সহজেই কোনও বৈশিষ্ট্য থাকতে পারে না। একজনের তিনটি পৃথক বৈশিষ্ট্য থাকতে হবে যা বিকাশকারীদের বিভ্রান্ত করে এবং তিনটির মধ্যে একটিরই ব্যবহৃত হয় তা নিশ্চিত করার জন্য রানটাইম বৈধতা প্রয়োজন।

  2. প্রতি সাইট প্রদত্ত ধরণের কেবল একটি টিকা। এটি সম্পূর্ণরূপে অপ্রয়োজনীয় সংগ্রহের টীকাটি বাড়ে। @ ভ্যালিডেশন এবং @ ভালিডেশন, @ ইমেজ এবং @ চিত্রগুলি, ইত্যাদি

দ্বিতীয়টি জাভা 8 এ প্রতিকার করা হচ্ছে, তবে এটি খুব দেরিতে। জাভা 5 এ যা সম্ভব ছিল তার উপর ভিত্তি করে অনেকগুলি ফ্রেমওয়ার্ক রচনা করা হয়েছে এবং এখন এই এপিআই ওয়ার্টগুলি ভাল দীর্ঘ সময় থাকার জন্য এখানে রয়েছে।


1
কেবল তা-ই নয়, এটি এমন বৈশিষ্ট্যগুলি সংজ্ঞা দেওয়াও অসম্ভব করে তোলে যা পুনরাবৃত্তভাবে নেস্টেড বৈশিষ্ট্যগুলি - যা এক্সএমএল স্কিমা দ্বারা সমর্থিত। এটি
এনএমএলগুলি

3

এই প্রশ্নের জবাব দিতে আমি তিন বছর দেরীতে হতে পারি, তবে আমি আকর্ষণীয় বলে মনে করেছি কারণ আমি নিজেকে একই জায়গায় পেয়েছি। এটি আমার গ্রহণ এখানে। আপনি এনামগুলি এনামগুলি হিসাবে দেখতে পারেন। তারা একমুখী ধরণের তথ্য সরবরাহ করে - এটি ব্যবহার করুন বা এটি হারাবেন।

আমার একটি পরিস্থিতি ছিল যেখানে আমি জিইটি, পোস্ট, পুট এবং একটি ওয়েব-অ্যাপে মুছে ফেলতে চেয়েছিলাম। আমি খুব খারাপভাবে একটি "সুপার" টীকা পেতে চেয়েছিলাম যার নাম "HTTP_METHOD" ছিল। পরে এটি আমার সম্পর্কে ছড়িয়ে পড়ে যে এটি কোনও ব্যাপার নয়। ভাল, ডিলিট এবং পুট সনাক্ত করতে আমাকে HTML ফর্মটিতে একটি লুকানো ক্ষেত্র ব্যবহার করে স্থির করতে হয়েছিল (কারণ পোষ্ট এবং জিইটি যেভাবেই পাওয়া যায়)।

সার্ভার-সাইডে, আমি "_ স্মৃতি" নামে একটি লুকানো অনুরোধ প্যারামিটারের সন্ধান করেছি। যদি মানটি PUT বা মুছে ফেলা হয়, তবে এটি সম্পর্কিত HTTP অনুরোধ পদ্ধতিটিকে ওভাররড করে। এটি বলার পরেও, কাজটি করার জন্য আমার কাছে কোনও টীকা বাড়ানোর দরকার ছিল কিনা তা বিবেচ্য নয়। সমস্ত টীকাগুলি দেখতে একই রকম লাগছিল তবে সার্ভারের দিক থেকে তাদের সাথে আলাদাভাবে আচরণ করা হয়েছিল।

সুতরাং আপনার ক্ষেত্রে, টীকাগুলি বাড়ানোর জন্য চুলকানি ফেলে দিন। তাদেরকে 'চিহ্নিতকারী' হিসাবে গণ্য করুন। এগুলি কিছু তথ্য "উপস্থাপন" করে এবং প্রয়োজনীয় কিছু তথ্য "ম্যানিপুলেট" করে না।


2

একটি জিনিস যা আমি ভাবতে পারি তা হ'ল একাধিক টিকা দেওয়া। সুতরাং আপনি একই স্থানে বৈধকারক এবং আরও একটি নির্দিষ্ট টীকা যুক্ত করতে পারেন। তবে আমার ভুল হতে পারে :)


2

এটি সম্পর্কে কখনও ভাবেন নি তবে ... মনে হয় আপনি ঠিক বলেছেন, টীকাগুলির উত্তরাধিকার সুবিধায় কোনও সমস্যা নেই (কমপক্ষে আমি এতে সমস্যাটি দেখতে পাচ্ছি না)।

'বৈধকারক' টীকা সহ আপনার উদাহরণ সম্পর্কে - আপনি তখন 'মেটা-টিকা' পদ্ধতির ব্যবহার করতে পারেন । অর্থাৎ আপনি পুরো টিকাটি ইন্টারফেসে নির্দিষ্ট মেটা-টিকা প্রয়োগ করেন।


এই প্রশ্নের জবাব দিতে আমি তিন বছর দেরীতে হতে পারি, তবে আমি আকর্ষণীয় বলে মনে করেছি কারণ আমি নিজেকে একই জায়গায় পেয়েছি।
mainas

1

আমারও একই সমস্যা না, আপনি পারবেন না। কিছু মানকে সম্মান জানাতে আমি টীকাতে সম্পত্তি লিখতে নিজেকে 'শৃঙ্খলাবদ্ধ' করেছিলাম, সুতরাং যখন আপনি টিকাটি পান তখন আপনি এটিতে থাকা বৈশিষ্ট্যগুলির দ্বারা কোনও ধরণের অদ্ভুত মন্তব্যটি 'স্নিফ' করতে পারেন can

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.