কনস্ট্যান্ট জাভা থেকে কোনও টীকাতে কীভাবে মান সরবরাহ করা যায়


146

আমি ভাবছি জাভাতে এটি সম্ভবত সম্ভব না কারণ টীকা এবং এর পরামিতিগুলি সংকলনের সময়ে সমাধান করা হয়েছে। আমার নীচে একটি ইন্টারফেস আছে,

public interface FieldValues {
   String[] FIELD1 = new String[]{"value1", "value2"};
}

এবং অন্য শ্রেণি হিসাবে,

@SomeAnnotation(locations = {"value1", "value2"})
public class MyClass {
   ....
}

আমি টীকাটি সহ অনেকগুলি ক্লাস চিহ্নিত করি এবং আমি জানতে চাই যে আমি প্রতিটি টিকাতে স্ট্রিংগুলি নির্দিষ্ট করে এড়াতে পারি কিনা আমি পরিবর্তে ব্যবহার করতে পছন্দ করব

@SomeAnnotation(locations = FieldValues.FIELD1)
public class MyClass {
   ....
}

তবে এটি সংকলন ত্রুটিগুলি দেয় যেমন টীকা মান একটি অ্যারে প্রারম্ভিক হওয়া উচিত ইত্যাদি someone কেউ কি জানেন যে আমি কোনও টীকায় মান সরবরাহ করতে স্ট্রিং ধ্রুবক বা স্ট্রিং [] ধ্রুবকটি কীভাবে ব্যবহার করতে পারি?

উত্তর:


126

সংকলন ধ্রুবকগুলি কেবল আদিম এবং স্ট্রিংস হতে পারে :

15,28। কনস্ট্যান্ট এক্সপ্রেশন

একটি সংকলন- স্থির ধ্রুবক প্রকাশটি এমন একটি অভিব্যক্তি যা আদিম ধরণের বা স্ট্রিংয়ের মানকে বোঝায় যা হঠাৎ করে সম্পূর্ণ হয় না এবং কেবল নিম্নলিখিত ব্যবহার করে রচিত হয়:

  • আদিম ধরণের লিটারাল এবং টাইপের আক্ষরিক String
  • আদিম ধরণের জাতগুলি এবং টাইপ করতে কাস্ট String
  • [...] অপারেটররা [...]
  • প্যারেনথেসাইজড এক্সপ্রেশনগুলি যার অন্তর্ভুক্ত প্রকাশটি একটি ধ্রুবক প্রকাশ।
  • সাধারণ নাম যা ধ্রুবক ভেরিয়েবলগুলি উল্লেখ করে।
  • টাইপনামের ফর্মের যোগ্য নাম । ধ্রুবক ভেরিয়েবল উল্লেখ করে সনাক্তকারী

আসলে জাভাতে কোনও অ্যারেতে আইটেমগুলি রক্ষা করার কোনও উপায় নেই। রানটাইম এ সময়ে যে কেউ সর্বদা করতে পারেন FieldValues.FIELD1[0]="value3", তাই আরও গভীরভাবে দেখলে অ্যারে সত্যিই ধ্রুবক হতে পারে না।


14
এনামও! :) :)
TacB0sS

1
@ TacB0sS, এনামগুলি ধ্রুবক প্রকাশ নয়।
jaco0646

ঠিক আছে ... সম্ভবত আপনি
একবারে

4
আরও প্রাসঙ্গিক স্পেসটি টীকাগুলির অধীনে । ধ্রুবক অভিব্যক্তি ছাড়াও, একটি টীকা মানটি একটি অ্যারে আরম্ভকারী , শ্রেণীর আক্ষরিক বা এনাম ধ্রুবক হতে পারে
jaco0646

3
@ ট্যাকবি0 এসএস আপনি এ্যানোটেটিওগুলিতে ব্যবহার করতে পারেন enumতবে তারা সংকলন-সময় ধ্রুবক নয়। আপনি লিখতে static final EnumType VARIABLE = EnumType.ENUM_CONSTANT;এবং VARIABLEএকটি টীকায় ব্যবহার করার চেষ্টা করার সময় পার্থক্যটি স্পষ্ট হয় ; এটা কাজ করবে না। আপনি কেবল এমনটি ব্যবহার করতে পারেন EnumType.ENUM_CONSTANTযা ধ্রুবক প্রকাশ নয়, তবে টীকাগুলিতে (এবং switchবিবৃতিতে) নির্দিষ্টভাবে অনুমোদিত ।
হলগার

37

আপনি একটি টিকাশনের জন্য প্যারামিটার হিসাবে একটি ধ্রুবক (অর্থাত্ একটি স্ট্যাটিক, চূড়ান্ত পরিবর্তনশীল) ব্যবহার করতে পারেন। দ্রুত উদাহরণ হিসাবে, আমি প্রায়শই প্রায় এই জাতীয় কিছু ব্যবহার করি:

import org.junit.Test;
import static org.junit.Assert.*;

public class MyTestClass
{
    private static final int TEST_TIMEOUT = 60000; // one minute per test

    @Test(timeout=TEST_TIMEOUT)
    public void testJDK()
    {
        assertTrue("Something is very wrong", Boolean.TRUE);
    }
}

মনে রাখবেন যে TEST_TIMEOUTধ্রুবকটি সরাসরি টীকায় প্রবেশ করা সম্ভব ।

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

সম্পাদনা করুন: আমি শুধু একটি স্ট্রিং অ্যারে সঙ্গে এই চেষ্টা করেছি, এবং সমস্যা আপনাকে উল্লেখ মধ্যে চালানো হয়নি - তবে কম্পাইলার হয়নি যে আমাকে বলুন অ্যারে হিসাবে সংজ্ঞায়িত করা হচ্ছে সত্ত্বেও "অ্যাট্রিবিউট মান ধ্রুবক হতে হবে" public static final String[]। সম্ভবত এটি অ্যারেগুলি পারস্পরিক পরিবর্তনযোগ্য তা পছন্দ করে না? হুম ...


1
আমার জন্য শক্ত ভাগ্য! ওহ ইয়া আমি স্ট্রিংস / নাম্বারগুলি পাস করতে পেরেছি তবে অ্যারে নয়। আমি
এটিতে

হ্যাঁ, আমার অনুমান হবে যে FIELD1 অ্যারের পরিবর্তনের বিষয়টি এখানে সমস্যা। আপনাকে অ্যারে ইনিশিয়ালাইজার দিয়ে অ্যারে ঘোষণা করার অনুমতি দেওয়া হয়েছে কারণ অন্য কোনও কিছুইতে সেই অ্যারেতে অ্যাক্সেস থাকতে পারে না এবং তাই এটি পরে পরিবর্তন করা যায় না।
কলিনড

এটি আমার সমস্যা সমাধান করে। টীকাগুলি এবং কোডের মধ্যে কেবল একটি স্ট্রিং ধ্রুবক ভাগ করা দরকার। ধন্যবাদ!
সাইমন

1
স্থির চূড়ান্ত পরিবর্তনশীল একমাত্র পূর্বশর্ত নয়। আপনি যদি পরিবর্তনশীলটিকে গতিশীলভাবে গণনা করার চেষ্টা করেন তবে আপনি একই ত্রুটি বার্তা পাবেন।
ওল্ফগ্যাং ফাহল

11

আপনি এটি আপনার উদাহরণের একটি অ্যারে দিয়ে সরবরাহ করছেন না। নিম্নলিখিত সংকলন জরিমানা:

public @interface SampleAnnotation {
    String[] sampleValues();
}

public class Values {
    public static final String val0 = "A";
    public static final String val1 = "B";

    @SampleAnnotation(sampleValues={ val0, val1 })
    public void foo() {
    }
}

4
এটি উদাহরণস্বরূপ একটি অ্যারের সাথে সরবরাহ করা হচ্ছে, কেবলমাত্র টিকা ঘোষণায় সরাসরি তৈরি করা হয় না।
কলিনড

7

কেউ কি জানেন যে আমি কোনও টীকায় মান সরবরাহ করতে স্ট্রিং ধ্রুবক বা স্ট্রিং [] ধ্রুবকটি কীভাবে ব্যবহার করতে পারি?

দুর্ভাগ্যক্রমে, আপনি অ্যারে দিয়ে এটি করতে পারবেন না। নন-অ্যারে ভেরিয়েবলগুলির সাথে মানটি অবশ্যই চূড়ান্ত স্থির be


5

আমি ভাবছি জাভাতে এটি সম্ভবত সম্ভব না কারণ টীকা এবং এর পরামিতিগুলি সংকলনের সময়ে সমাধান করা হয়েছে।

সিম 2 http://seamframework.org/ এর সাহায্যে আপনি রানটাইমে টীকাগুলির পরামিতিগুলি দ্বিগুণ উদ্ধৃতিতে প্রকাশের ভাষা সহ সমাধান করতে সক্ষম হন।

সিম 3 http://seamframework.org/Seam3/Solder এ , বৈশিষ্ট্যটি মডিউলটি সিম সোল্ডার


3
না, আপনি রানটাইমে প্যারামিটারগুলি সমাধান করেন নি । পরামিতি সংকলন সময়ে সমাধান করা হয়েছিল। যেগুলি তখন রানটাইমের সময় কিছু করতে ব্যবহৃত হত তাদের মান নির্ধারণের সাথে আক্ষরিকভাবে কিছুই করার ছিল না।
মনিকার মামলার তহবিল

1

আপনি এনাম ব্যবহার করতে পারেন এবং টীকা দেওয়ার ক্ষেত্রে সেই এনামটি উল্লেখ করতে পারেন


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