Devo creare interfacce separate per centralizzare le annotazioni?

2

Supponiamo che abbia queste classi:

@Entity
@Data
class Student{
    @Size(min = 8)
    public String name;
    public int age;
    ...
}

@Data
class StudentDTO{
    @Size(min = 8)
    public String name;
    ....
}

Per ridurre le annotazioni duplicate, ho scoperto un trucco semplice come questo:

interface HasName {
    @Size(min=8)
    String getName();
}
@Entity
@Data
class Student implements HasName {
    public String name;
    public int age;
}
@Data
class StudentDTO implements HasName{
    public String name;
}

Potrebbero esserci più campi.

Pro:

  • Nessuna annotazione duplicata
  • L'annotazione sarà unificata

Contro:

  • Aumenta la complessità
  • Aumenta la dipendenza

Ma sembra un odore di codice per me, quindi è buono o cattivo?

    
posta cdxf 07.05.2018 - 21:05
fonte

1 risposta

3

La tua strategia funzionerà, ma non riesco a vedere come una buona soluzione. Le tue classi implementerebbero così tante interfacce che l'obiettivo di avere un'interfaccia nella tua classe andrebbe perso se ti mescolerai con interfacce più significative: quelle che realmente agiranno come contratti nel tuo codice.

La soluzione classica per questo tipo di problema di annotazione è creare una nuova annotazione che aggrega altre annotazioni, ad esempio:

@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Size(min = 8)
public @interface Name {

}

E da usare:

@Name
private String name;

L'annotazione @Name continuerà a essere replicata, ma puoi modificare la dimensione minima (ad esempio) e aggiungere altre annotazioni al nome (come @NotNull ) su un singolo punto.

In generale, non mi piace usare le annotazioni per fare la convalida delle mie lezioni. Quindi, se stai già cercando di unificare la convalida senza diffondere l'annotazione, prova a fare la validazione sul costruttore senza alcuna annotazione , qualcosa di più OOP, come:

private Name name;

E Name :

class Name {
    Name(String name) {
        if (name.size() < 8) {
            //throw some exception
        }
    }
}
    
risposta data 07.05.2018 - 21:41
fonte

Leggi altre domande sui tag