এক উপাদানটিতে একই ধরণের একাধিক টিকা?


91

আমি এক ধরণের ক্ষেত্রে একই ধরণের দুটি বা আরও বেশি টীকাগুলি চড় মারার চেষ্টা করছি, এই ক্ষেত্রে, একটি পদ্ধতি। এখানে আমি যে আনুমানিক কোডটি নিয়ে কাজ করছি তা এখানে:

public class Dupe {
    public @interface Foo {
      String bar();
    }

    @Foo(bar="one")
    @Foo(bar="two")
    public void haha() {}
}

উপরোক্ত সংকলন করার সময় জাভ্যাক একটি সদৃশ টিকা সম্পর্কে অভিযোগ করে:

সর্বোচ্চ @ দৃষ্টিশক্তি: ~ / কাজ / দিবস বিরতি ak জাভাক ডুপ.জভা j 
Dupe.java:5: নকল টীকা ot

এই জাতীয় টীকা পুনরাবৃত্তি করা কি সহজভাবে সম্ভব নয়? শিশুতোষভাবে বলতে গেলে @Foo- এর দুটি উদাহরণ পৃথক নয় কারণ তাদের বিষয়বস্তু আলাদা?

উপরেরটি যদি সম্ভব না হয় তবে কিছু সম্ভাব্য কাজের পরিমাণগুলি কী কী?

আপডেট: আমাকে আমার ব্যবহারের ক্ষেত্রে বর্ণনা করতে বলা হয়েছে। এখানে যায়।

আমি মোঙ্গোডিবি এর মতো ডকুমেন্ট স্টোরগুলিতে পিওজেওগুলিকে "ম্যাপ" করার জন্য একটি সিনট্যাক্স চিনির প্রক্রিয়া তৈরি করছি। আমি সূচকগুলি গ্রাহকদের বা সেটটারগুলিতে টীকা হিসাবে নির্দিষ্ট করার অনুমতি দিতে চাই। এখানে একটি স্বতন্ত্র উদাহরণ:

public class Employee {
    private List<Project> projects;

    @Index(expr = "project.client_id")
    @Index(expr = "project.start_date")
    public List<Project> getProjects() { return projects; }
}

স্পষ্টতই, আমি প্রকল্পের বিভিন্ন সম্পত্তি দ্বারা কর্মচারীর উদাহরণগুলি দ্রুত খুঁজে পেতে সক্ষম হতে চাই। আমি হয় হয় আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা স্পেসিক্স () মান সহ দুটিবার @ ইন্ডেক্সকে নির্দিষ্ট করতে পারি, বা স্বীকৃত উত্তরে বর্ণিত পদ্ধতির নিতে পারি। যদিও হাইবারনেট এটি করে এবং এটি হ্যাক হিসাবে বিবেচিত হয় না, তবে আমি মনে করি এটি এখনও কমপক্ষে একটি একক উপাদানের উপর একই ধরণের একাধিক টিকাকর্ষণ করার অনুমতি দেওয়া বুদ্ধিমান।


4
জাভাতে আপনার প্রোগ্রামটির অনুমতি দেওয়ার জন্য এই সদৃশ নিয়মটি শিথিল করার চেষ্টা রয়েছে you আপনি কি আপনার ব্যবহারের ক্ষেত্রে বর্ণনা করতে পারেন?
ননোপ করুন

আমি কেন এটি করতে চাই তার বিবরণ দিয়ে আমি আমার প্রশ্নটি সম্পাদনা করেছি। ধন্যবাদ
সর্বোচ্চ A.

একাধিক যোগ্যতা অর্জনকারীদের জন্য শিম সরবরাহ করার অনুমতি দেওয়া এটি সিডিআইয়ের পক্ষে সহজ হতে পারে। উদাহরণস্বরূপ, আমি মাত্র একটি শিমকে দুটি স্থানে পুনরায় ব্যবহার করার চেষ্টা করেছি "@ প্রোডাক্টস @ প্যাকেজনাম (" টেস্ট 1 ") @ প্যাকেজনাম (" টেস্ট 2 ")"
রিচার্ড করফিল্ড

আরও: নীচের উত্তরগুলি সেই সমস্যাটি সমাধান করে না কারণ সিডিআই সম্মিলিতটিকে একজন বাছাইকারী হিসাবে দেখবে।
রিচার্ড করফিল্ড

@ ম্যাক্সা। দয়া করে আপনার "সবুজ চেক" গ্রহণযোগ্যতা মার্েন্টস্ট দ্বারা সঠিক উত্তরে পরিবর্তন করুন। জাভা 8 টি টীকাগুলির পুনরাবৃত্তি করার ক্ষমতা যুক্ত করেছে।
তুলসী বাউরক

উত্তর:


140

একই ধরণের দুটি বা ততোধিক টীকা অনুমোদিত নয়। তবে আপনি এই জাতীয় কিছু করতে পারেন:

public @interface Foos {
    Foo[] value();
}

@Foos({@Foo(bar="one"), @Foo(bar="two")})
public void haha() {}

কোডে যদিও আপনার ফুস টীকা নিবেদিত হ্যান্ডলিং প্রয়োজন।

বিটিডব্লিউ, আমি একই সমস্যাটি প্রায় কাজ করতে 2 ঘন্টা আগে এটি ব্যবহার করেছি :)


4
আপনি কি গ্রোভিতে এটি করতে পারেন?
এক্সেল 20

4
@ এক্সেল ২০ হ্যাঁ আপনাকে যেমন বর্গাকার বন্ধনী ব্যবহার করতে হবে, যেমন @Foos([@Foo(bar="one"), @Foo(bar="two")])। দেখুন groovy.codehaus.org/Annotations+with+Groovy
sfussenegger

দিনের খানিকটা দেরি করে তবে সেই পরামর্শের প্রতি ইঙ্গিত করা উচিত যা ফুসের ভিতরে ফু-র তালিকা প্রক্রিয়া করতে পারে? এই মুহুর্তে আমি একটি পদ্ধতির ফলাফলকে প্রসেস করার চেষ্টা করছি তবে ফুসকে বাধা দেওয়া হলেও ফু এর পরামর্শ কখনও প্রবেশ করা হয় না
স্টিলিওস কৌসৌরিস

আপডেট: জাভা 8 হিসাবে, এই উত্তরটি পুরানো। Mernst দ্বারা সঠিক আধুনিক উত্তর দেখুন । জাভা 8 টি টীকাগুলির পুনরাবৃত্তি করার ক্ষমতা যুক্ত করেছে।
তুলসী বাউরক

65

জাভা 8 এ টীকা পুনরাবৃত্তি করা হচ্ছে

ইন জাভা 8 (মার্চ 2014 সালে প্রকাশিত), এটা পুনরাবৃত্তি / ডুপ্লিকেট টীকা লেখা করা সম্ভব।

টিউটোরিয়াল দেখুন, টিকাদান পুনরাবৃত্তি

স্পেসিফিকেশন দেখুন, জেপি 120: পুনরাবৃত্তি টীকাগুলি


4
অফিশিয়াল ডকুমেন্ট ডকস.অরাকল.com
অ্যান্ডারসন

21

উল্লিখিত অন্যান্য উপায়গুলি ছাড়াও, জাভা 8-এ আরও একটি কম ভার্বোস উপায় রয়েছে:

@Target(ElementType.TYPE)
@Repeatable(FooContainer.class)
@Retention(RetentionPolicy.RUNTIME)
@interface Foo {
    String value();

}

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface FooContainer {
        Foo[] value();
        }

@Foo("1") @Foo("2") @Foo("3")
class Example{

}

ডিফল্টরূপে FooContainerউদাহরণটি একটি টিকা হিসাবে পাওয়া যায়

    Arrays.stream(Example.class.getDeclaredAnnotations()).forEach(System.out::println);
    System.out.println(Example.class.getAnnotation(FooContainer.class));

উপরের দুটি মুদ্রণ:

@ com.FooContainer (মান = [@ com.Foo (মান = 1), @ com.Foo (মান = 2), @ com.Foo (মান = 3)])

@ com.FooContainer (মান = [@ com.Foo (মান = 1), @ com.Foo (মান = 2), @ com.Foo (মান = 3)])


এটি উল্লেখ করার মতো যে FooContainer এর পদ্ধতি / ক্ষেত্রের নামটির কঠোর নামকরণ করা উচিত "মান ()"। অন্যথায় ফু সংকলন করবে না।
টমাসজ মুলারসিজিক

... এছাড়াও টীকা জাতীয় টাইপ (FooContainer) পুনরাবৃত্তিযোগ্য টিকা টাইপ (ফু) এর চেয়ে বেশি ধরণের ক্ষেত্রে প্রযোজ্য হতে পারে।
টমাসজ মুলারসিজিক

16

http://docs.oracle.com/javase/tutorial/java/annotations/repeating.html

জাভা 8 থেকে শুরু করে আপনি পুনরাবৃত্তিযোগ্য টীকাগুলি বর্ণনা করতে পারেন:

@Repeatable(FooValues.class)
public @interface Foo {
    String bar();
}

public @interface FooValues {
    Foo[] value();
}

নোট, valueমান তালিকার জন্য প্রয়োজনীয় ক্ষেত্র।

এখন আপনি অ্যারে পূরণের পরিবর্তে এগুলি পুনরাবৃত্তি করতে টীকাগুলি ব্যবহার করতে পারেন:

@Foo(bar="one")
@Foo(bar="two")
public void haha() {}

12

যেমনটি sfussnegger বলেছেন, এটি সম্ভব নয়।

সাধারণ সমাধান হ'ল "একাধিক" টিকা তৈরি করা , যা পূর্ববর্তী টীকাটির অ্যারে পরিচালনা করে। এটি সাধারণত 's' প্রত্যয় সহ একই নামকরণ করা হয়।

যাইহোক, এটি বড় পাবলিক প্রকল্পগুলিতে খুব ব্যবহৃত হয় (উদাহরণস্বরূপ হাইবারনেট), সুতরাং এটি হ্যাক হিসাবে বিবেচনা করা উচিত নয়, বরং এই প্রয়োজনের জন্য একটি সঠিক সমাধান হিসাবে বিবেচনা করা উচিত।


আপনার প্রয়োজনের উপর নির্ভর করে, ভালো হতে পারে আপনার আগের টীকা একাধিক মান হ্যান্ডেল করার অনুমতি দেয়

উদাহরণ:

    public @interface Foo {
      String[] bars();
    }

আমি জানতাম এটি অত্যন্ত পরিচিত ছিল। আমার স্মৃতি সতেজ করার জন্য ধন্যবাদ।
সর্বোচ্চ A.

জাভা 8 দিয়ে এটি এখন সম্ভব
আনিস

4

অন্যান্য উত্তরগুলি সহজতম ফর্মের সাথে সংমিশ্রণ করা হচ্ছে ... মানগুলির একটি সাধারণ তালিকা সহ একটি টীকা ...

@Foos({"one","two"})
private String awk;

//...

public @interface Foos{
    String[] value();
}

3

আপনার যদি মাত্র 1 টি প্যারামিটার "বার" থাকে তবে আপনি এটির "মান" হিসাবে নাম রাখতে পারেন। এই ক্ষেত্রে প্যারামিটারের নামটি লিখতে হবে না যখন আপনি এটি ব্যবহার করেন:

@Foos({@Foo("one"), @Foo("two")})
public void haha() {}

কিছুটা খাটো এবং আরও সুন্দর, ইমো ..


সঠিক বক্তব্য, তবে ওপির প্রশ্নের উত্তর দেওয়ার এই প্রচেষ্টা কী করে?
মর্দচাই

@ মাউস ইভেনথ আপনি ঠিক বলেছেন, তবে আমার মনে হয় এটি সফুসনেগারের শীর্ষ উত্তরের একটি উন্নতি ছিল এবং সেখানকার মন্তব্যগুলিতে এটি আরও বেশি। তবে পুনরাবৃত্তিযোগ্য টীকাগুলির কারণে উত্তরটি যাইহোক পুরানো হয়ে গেছে ...
golwig

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