2009-04-08 25 views
6

Soru, her şeyi anlatır. Daha sonra derleyiciler yok ederken Uzmanlar içinStandart olmayan ek açıklamaları (veya tanımlamaları) kullanıyorsunuz ve hangi sebepten dolayı. Yinelemeli ek açıklamalara ne dersiniz?

, GÜNEŞ java 5 derleyici (langspec aykırı) özyinelemeli açıklamaları kabul eden bir neden vardır? Ben özyinelemeli ek açıklamalar karşı bir argüman ne olabileceğini, yani.

Düzenleme: Bir özyinelemeli açıklama gibi bir şey:

@Panel(layout=BorderLayout.class, 
    nested={ 
     @Panel(region=NORTH, layout=FlowLayout.class, ...) 
     @Panel(region=SOUTH, layout=FlowLayout.class, ...) 
    } 
) 
+0

Ben özyinelemeli ek açıklamalar, hem de onlar için bir kullanım örneği görme ilgi duyarım. Sorunuzu doldurmak için gönderebileceğiniz referanslarınız var mı? –

+0

Hayır, şu anda böyle bir referansım yok. Ama size şunu söyleyebilirim: İşlevsel bir dil derleyicisi java kodu yayar ve kod, derleyici toplanan bazı yararlı bilgilerle (tür, katılık vb.) Açıklanır. Tabii ki, @Type için ek açıklama özyineli. – Ingo

cevap

2

İlk - Sana özyinelemeli ek açıklamalar ile ne demek emin değilim. Aynı türdeki diğer ek açıklamalar başvurular içerebilir ek açıklamaları ifade ediyor mu? (Bunun mümkün olsaydı kullanmak istedikleri yerleri bir örnek olur ...)

@Panel(layout=BorderLayout.class, 
    nested={ 
     @Panel(region=NORTH, layout=FlowLayout.class, ...) 
     @Panel(region=SOUTH, layout=FlowLayout.class, ...) 
    } 
) 

gibi bir şey özel ek açıklamalar (ve işlemciler) benim kullanımı gelince

: kod oluşturma .

http://code.google.com/p/javadude/wiki/Annotations Örneğin

, JavaBean özelliklerine bakın:

@Bean(
    properties={  
     @Property(name="name"), 
     @Property(name="phone", bound=true), 
     @Property(name="friend", type=Person.class, kind=PropertyKind.LIST) 
    } 
) 
public class Person extends PersonGen { 
    // generated superclass PersonGen will contain getters/setters 
    // field definitions, property change support... 
} 

veya bir karışımı-örneğin

package sample; 

import java.util.List; 

public interface IFlightAgent { 
    List<IFlight> getFlight(); 
    void reserve(IFlight flight); 
} 

public interface ICarAgent { 
    List<ICar> getCars(); 
    void reserve(ICar car); 
} 

public interface IHotelAgent { 
    List<IHotel> getHotels(); 
    void reserve(IHotel hotel); 
} 

package sample; 

import com.javadude.annotation.Bean; 
import com.javadude.annotation.Delegate; 

@Bean(delegates = { 
    @Delegate(type = IHotelAgent.class, 
       property = "hotelAgent", 
       instantiateAs = HotelAgentImpl.class), 
    @Delegate(type = ICarAgent.class, 
       property = "carAgent", 
       instantiateAs = CarAgentImpl.class), 
    @Delegate(type = IFlightAgent.class, 
       property = "flightAgent", 
       instantiateAs = FlightAgentImpl.class) 
    } 
) 
public class TravelAgent extends TravelAgentGen 
    implements IHotelAgent, ICarAgent, IFlightAgent 
{ 
    // generated superclass TravelAgentGen will create instances 
    // of the "instantiateAs" classes and delegate the interface 
    // methods to them 
} 

onların kullanımı ile bazı potansiyel sorunlar için kendisine The drawbacks of annotation processing in Java? ve benim cevap bakınız . Java Web Hizmetleri davranışını değiştirmek için Oracle Weblogic Server tarafından yoğun kullanılan olarak

+0

Özyinelemeli bir açıklamanın çekici bir örneği için teşekkürler. Beni tam olarak doğru anladın. +1 – Ingo

+0

havalı! Java5'de bunu yapabileceğinizi bilmiyordum ... çok kötü izin vermiyorlar :( –

+0

Bir java5 derleyicisi ile derlenen özyinelemeli açıklamaları kaynak kodda bile kullanabilir ve java6 derleyicileriyle derleyebiliriz. – Ingo

1

Ben, son zamanlarda ek açıklamaları kullanıyoruz. here'u tanımladıkları ek açıklamaların tam listesi var. O kendi güvenlik modeli off dayanır ne yana Özellikle, onların Policy annotation en kullanarak sonuna; Detaylı örneklerini documentation page numaralı telefondan görebilirsiniz.

Ben özyinelemeli ek açıklamalar duymadım.

1

Standart olmayan ek açıklamalar kullanıyorum, genellikle sınıf alanlarını RPC çağrılarında önbellekleme veya belirli başlatma işlemleri gibi bir yansıtmalı işlem için hedef olarak işaretlemek için kullanıyorum. Hiçbir zaman özyinelemeli açıklamalara ihtiyaç duymadım ... Ve sanırım standart başlatıcılar hazır olmadan önce ek açıklamaların sınıf tanımlı zamanda işlenmesi gerektiği gibi bir sorun var. Temel açıklamaların temel türlerle sınırlandırılmasının temel sebebi ...

+0

Yorumunuz için teşekkür ederiz, ancak Sun SDK Java 5'de, özyinelemeli açıklamalar sadece gayet iyi çalışıyor: Java 5 derleyicisiyle özyinelemeli açıklamalarınızı derledikten sonra, daha da şaşırtıcı olan şey, bunları kullanabiliyorsunuz.) kaynak kodunda ve Java 6 ile derleyin! – Ingo

0

Genel olarak, özyinelemeli açıklamalara izin vermeyle ilgili herhangi bir iyi argüman bilmiyorum, aksi halde kazayla yazabileceğiniz bazı patolojik durumlar sonsuz döngülere yol açabilir (Derleme veya çalışma zamanı sırasında) yasak ise.

javac, yalnızca belirtimin gerektirdiği gibi yinelemeli açıklama tanımlarını yasaklar. 'un belirtiminin ne demek olduğunu JLS'nin gelecekteki bir güncellemesinde (örneğin, JDK 7 için) başka bir meseledir.

Yani okuyup oy verin:

http://bugs.sun.com/view_bug.do?bug_id=6264216