Próbuję uderzyć dwie lub więcej adnotacji tego samego typu na jeden element, w tym przypadku, metodę. Oto przybliżona Kod że pracuję z:Wiele adnotacji tego samego typu na jednym elemencie?
public class Dupe {
public @interface Foo {
String bar();
}
@Foo(bar="one")
@Foo(bar="two")
public void haha() {}
}
Przy sporządzaniu powyższego, javac narzeka duplikatu adnotacji:
[email protected]:~/work/daybreak$ javac Dupe.java Dupe.java:5: duplicate annotation
Jest on po prostu nie można powtórzyć adnotacji w ten sposób? Z pedantycznego punktu widzenia nie są dwa przypadki @Foo powyżej różnych ze względu na różne ich zawartości?
Jeśli powyższe nie jest możliwe, jakie są potencjalne sposoby obejścia problemu?
AKTUALIZACJA: Poproszono mnie o opisanie mojego przypadku użycia. Tutaj idzie.
Buduję mechanizm cukrowej składni, aby "mapować" POJO do sklepów z dokumentami, takich jak MongoDB. Chcę zezwolić na określanie indeksów jako adnotacji dla modułów pobierających lub ustawiających. Oto zmyślony przykład:
public class Employee {
private List<Project> projects;
@Index(expr = "project.client_id")
@Index(expr = "project.start_date")
public List<Project> getProjects() { return projects; }
}
Oczywiście, chcę być w stanie szybko znaleźć wystąpień pracownikowi przez różne właściwości projektu. Mogę albo podać @Index dwa razy z różnymi wartościami expr(), albo przyjąć podejście określone w zaakceptowanej odpowiedzi. Mimo, że Hibernate to robi i nie jest to uważane za hackowanie, myślę, że nadal sensowne jest przynajmniej zezwolenie na posiadanie wielu adnotacji tego samego typu na jednym elemencie.
Istnieje starań, aby ta podwójna reguła się rozluźniła, aby pozwolić na twój program w Javie 7. Czy możesz opisać swój przypadek użycia? – notnoop
Edytowałem moje pytanie z opisem, dlaczego chcę to zrobić. Dzięki. –
Może to być przydatne w CDI, aby umożliwić dostarczenie komponentu bean dla wielu kwalifikatorów. Na przykład próbowałem ponownie użyć komponentu bean w dwóch miejscach, kwalifikując go jako "@Produces @PackageName (" test1 ") @PackageName (" test2 ")" –