Я не знаю, что аннотации когда-нибудь заменили бы интерфейс, но я могу видеть привлекательность. Все зависит от реализации, хотя.
Аннотации предоставляют метаданные для дальнейшего описания кода, который потребитель (большую часть времени) интерпретирует во время выполнения, используя отражения. Используя интерфейс, этот контракт реализации четко определен.
Вы можете иметь:
interface CrudDao<T> {
Serializable create(T t);
T read(Serializable id);
void update(T t);
void delete(T t);
}
Это будет громоздкий контракт для реализации, и, скорее всего, возникнет какая-то цепочка методов.
Вместо этого вы можете сделать что-то вроде:
class SomeDao {
@Create
long create(SomeEntity e) { // code }
@Read
SomeEntity read(long id) { // code }
@Update
void update(SomeEntity e) { // code }
@Delete
void delete(SomeEntity e) { // code }
}
Недостатком является то, что было бы неудобно использовать:
class CrudFactory {
long create(Class clazz, Object obj) {
// loop through methods
// find method with @Create
// call method
}
}
Аннотации в этом примере были бы излишними в большинстве случаев, ИМО. Есть что-то, что можно сказать о четко определенном, хорошо документированном контракте.