Sabit bir java'dan bir ek açıklamaya nasıl değer sağlanır


153

Bunun Java'da mümkün olmayabileceğini düşünüyorum çünkü ek açıklama ve parametreleri derleme zamanında çözülür. Aşağıdaki gibi bir arayüze sahibim,

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

ve başka bir sınıf,

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

Birçok sınıfı ek açıklamayla işaretlerim ve bunun yerine kullanmayı tercih ettiğim her ek açıklamada dizeleri belirtmekten kaçınabilir miyim bilmek isterim.

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

Ancak bu, açıklama değerinin bir dizi başlatıcı olması gerektiği gibi derleme hataları verir. Bir ek açıklamaya değer sağlamak için String sabitini veya String [] sabitini nasıl kullanabileceğimi bilen biri var mı?

Yanıtlar:


130

Derleme sabitleri yalnızca ilkel öğeler ve Dizeler olabilir :

15.28. Sabit İfadeler

Derleme zamanı sabiti ifadesi , ilkel türdeki bir değeri veya aniden tamamlanmayan ve yalnızca aşağıdakiler kullanılarak oluşturulan bir String değerini belirten bir ifadedir:

  • İlkel türde değişmezler ve türdeki değişmezler String
  • İlkel türlere dönüştürür ve yazıya dönüştürür String
  • [...] operatörler [...]
  • İçerdiği ifade sabit bir ifade olan parantez içine alınmış ifadeler.
  • Sabit değişkenlere atıfta bulunan basit isimler.
  • TypeName formunun nitelenmiş adları . Sabit değişkenlere atıfta bulunan tanımlayıcı .

Aslında java'da bir dizideki öğeleri korumanın bir yolu yoktur. Çalışma zamanında birisi her zaman yapabilir FieldValues.FIELD1[0]="value3", bu nedenle daha derine bakarsak dizi gerçekten sabit olamaz.


14
Numaralandırmalar da! :) :)
TacB0sS

1
@ TacB0sS, numaralandırmalar sabit ifadeler değildir.
jaco0646

Pekala ... belki de bir
denemelisin

5
Ek açıklamalar altında daha alakalı bir özellik bulunmaktadır . Sabit bir ifadeye ek olarak, bir açıklama değeri bir dizi başlatıcısı , bir sınıf değişmezi veya enum sabiti olabilir .
jaco0646

3
@ TacB0sS enumaçıklamalarda kullanabilirsiniz , ancak bunlar derleme zamanı sabiti değildir. Bir ek açıklamada yazıp static final EnumType VARIABLE = EnumType.ENUM_CONSTANT;kullanmaya çalıştığınızda fark belirgin hale gelir VARIABLE; işe yaramayacak. Yalnızca EnumType.ENUM_CONSTANTsabit bir ifade olmayan, ancak ek açıklamalarda (ve switchifadelerde) özel olarak izin verileni kullanabilirsiniz .
Holger

41

Bir açıklama için parametre olarak bir sabit (yani statik, son değişken) kullanabilirsiniz. Hızlı bir örnek olarak, bunun gibi bir şeyi oldukça sık kullanıyorum:

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_TIMEOUTSabiti doğrudan açıklamaya aktarmanın mümkün olduğunu unutmayın .

Önceden bunu bir dizi ile denediğimi hatırlamıyorum, bu yüzden dizilerin ek açıklama parametreleri olarak Java değişkenlerine kıyasla nasıl temsil edildiği konusunda küçük farklılıklar olan bazı sorunlarla karşılaşıyor olabilirsiniz. Ancak sorunuzun diğer kısmına gelince, herhangi bir sorun yaşamadan kesinlikle sabit bir String kullanabilirsiniz.

DÜZENLEME: Sadece dize dizisi ile bu denedim ve bahsettiğin sorun haline çalıştırmak vermedi - ancak derleyici vermedi dizi olarak tanımlanan rağmen "öznitelik değeri sabiti olmalıdır" söyle public static final String[]. Belki de dizilerin değiştirilebilir olması hoşuna gitmiyor mu? Hmm ...


1
Benim için Zor Şans! Oh yah Dizeleri / Sayıları geçirebildim ama dizileri geçemedim. Bunun için biraz daha zaman harcayacağım ve hiçbir şey işe
yaramazsa

Evet, tahminime göre FIELD1 dizisinin değişkenliği buradaki sorun. Diziyi bir dizi başlatıcı ile bildirmenize izin verilir çünkü başka hiçbir şey bu diziye erişemez ve bu nedenle daha sonra değiştirilemez.
ColinD

Bu benim sorunumu çözdü. Ek açıklamalar ve kod arasında bir String sabitinin paylaşılması yeterlidir. Teşekkürler!
simon

1
statik son değişken tek ön koşul değildir. Değişkeni dinamik olarak hesaplamaya çalışırsanız, aynı hata mesajını alırsınız.
Wolfgang Fahl

11

Örneğinizde ona bir dizi sağlamıyorsunuz. Aşağıdaki iyi derler:

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
Örnekte bir dizi ile sağlanıyor, sadece açıklama bildiriminde doğrudan yaratılan bir dizi değil.
ColinD

8

Bir ek açıklamaya değer sağlamak için String sabitini veya String [] sabitini nasıl kullanabileceğimi bilen var mı?

Ne yazık ki, bunu dizilerle yapamazsınız. Dizi olmayan değişkenlerde, değer son statik olmalıdır.


5

Bunun Java'da mümkün olmayabileceğini düşünüyorum çünkü ek açıklama ve parametreleri derleme zamanında çözülür.

Seam 2 http://seamframework.org/ ile, çift tırnak içindeki ifade dili ile açıklama parametrelerini çalışma zamanında çözebildiniz.

Seam 3 http://seamframework.org/Seam3/Solder'da bu özellik, Seam Solder modülüdür


3
Hayır, çözmedin parametreleri çalışma zamanında çözmediniz. Parametre, derleme zamanında çözüldü. Daha sonra çalışma zamanında bir şeyler yapmak için kullanılmalarının, değerlerinin ne zaman ayarlandığı ile tam anlamıyla hiçbir ilgisi yoktur.
Fund Monica'nın Davası

0

Numaralandırmayı kullanabilir ve ek açıklama alanında bu numaralandırmaya başvurabilirsiniz


1
Bir örnek eklemelisiniz.
m02ph3u5
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.