2009-04-30 12 views
7

Nadal nie jestem jasny w sprawie adnotacji w Javie. Początkowo myślałem, że służą tylko jako dokumentacja. Ale patrząc na tę dokumentację z Google App Engine Datastore, nie jestem tego taki pewien. @PersistenceCapable (identityType = IdentityType.APPLICATION) wygląda bardziej jak podpis metody.Jaką funkcję mają te adnotacje Java?

Jaki jest cel tego typu adnotacji? Co to robi?

import java.util.Date; 
import javax.jdo.annotations.IdGeneratorStrategy; 
import javax.jdo.annotations.IdentityType; 
import javax.jdo.annotations.PersistenceCapable; 
import javax.jdo.annotations.Persistent; 
import javax.jdo.annotations.PrimaryKey; 

@PersistenceCapable(identityType = IdentityType.APPLICATION) 
public class Employee { 
    @PrimaryKey 
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
    private Long id; 

    @Persistent 
    private String firstName; 

    @Persistent 
    private String lastName; 

    @Persistent 
    private Date hireDate; 

    public Employee(String firstName, String lastName, Date hireDate) { 
     this.firstName = firstName; 
     this.lastName = lastName; 
     this.hireDate = hireDate; 
    } 

    // Accessors for the fields. JDO doesn't use these, but your application does. 

    public Long getId() { 
     return id; 
    } 

    public String getFirstName() { 
     return firstName; 
    } 

    // ... other accessors... 
} 

Odpowiedz

9

Są to metadane poziomu źródła. Są sposobem na dodawanie informacji do kodu, który nie jest kodem, i który jest łatwo obrabiany maszynowo.

W twoim przykładzie są używane do konfigurowania mapowania obiektowo-relacyjnego dla tego typu obiektu. Mówi się, że na przykład pole id powinno być kluczem podstawowym dla tego obiektu, a te firstName, lastName i hireDate powinny być przechowywane w bazie danych. (Aby odróżnić te pola od pewnego przejściowego stanu obiektu.)

Obsługa GAE dla JDO musi wiedzieć, jakie obiekty będziesz próbował przechowywać w bazie danych. Robi to, przeglądając klasy w kodzie, szukając tych, które są oznaczone adnotacją @PersistenceCapable.

Zwykle są one używane do zastępowania wcześniej używanych zewnętrznych plików konfiguracyjnych; standardowa biblioteka Java ma narzędzia do odczytywania adnotacji w kodzie, co znacznie ułatwia ich przetwarzanie niż samodzielne instalowanie plików konfiguracyjnych i zapewnia bezpłatną obsługę IDE.

+1

Ok, więc ta klasa to rodzaj stenograficznego sposobu definiowania modelu. W dawnych czasach, jak powiedziałeś, możesz mieć plik konfiguracyjny w Struts, w którym używałbyś notacji tekstowych do konfiguracji swojego modelu. Ale tutaj robimy to samo z adnotacjami. Zakładam, że sposób działania adnotacji różni się w zależności od używanej biblioteki i od tego, jak biblioteka zdefiniowała adnotacje do działania. Tak więc @Persistent może oznaczać jedną rzecz w bibliotece JDO, ale inną rzecz w innej bibliotece. – Bijou

+0

Tak. Na przykład w trybie hibernacji można użyć plików .hbm.xml do wykonania tej konfiguracji lub adnotacji JPA. To jest pół-wspólne dla biblioteki, aby używać adnotacji określonych przez inną. W tym przypadku JDO jest specyfikacją Java, którą kilka bibliotek obsługuje/implementuje. Tak więc to magazyn danych Google App Engine czyta adnotacje JDO. Mniej powszechne jest, że mają one inne znaczenie. Jest to oczywiście całkowicie możliwe i łatwiej jest to zrobić za pomocą metadanych (adnotacji) niż programowo (wywoływanie niektórych metod). – millimoose

0

Myślę, że te pochodzą z interfejsu API Java Data Objects. Jest to API, które w pewnym stopniu pokrywa się z tym, co ma osiągnąć EJB3. Te same pojęcia, inna składnia i narzędzia.

Jeśli nie są zaznajomieni z adnotacji w ogóle, sprawdzić Java tutorial.

Powiązane problemy