Announcement

Collapse
No announcement yet.

Validierungsannotationen auf Feldern in Subklassen einer generischen Superklasse

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Validierungsannotationen auf Feldern in Subklassen einer generischen Superklasse

    Hallo,

    ich habe ein Problem mit den Validierungs Annotationen. Und zwar hab ich eine generische Superklasse:
    Code:
    abstract class AbstractKeyedEntity<K extends Comparable<K> & Serializable> {
      @NotNull
      private K key;
    
      AbstractKeyedEntity(K key) {
        this.key = key;
      }
      //... getter etc.
    }
    Und nun zwei konkrete Subklassen:
    Code:
    public StringKeyedEntity extends AbstractKeyedEntity<String> {
      //... StringKeyedEntity spezifischer Code
    }
    
    public LongKeyedEntity extends AbstractKeyedEntity<Long> {
      //... LongKeyedEntity spezifischer Code
    }
    In meiner StringKeyedEntity hätte ich jetzt gerne eine Annotation @Length, die die Stringlänge validiert und in meiner LongKeyedEntity eine Annotation @Min, um das Minimum festzulegen. Nur in diesen beiden Subklassen hab ich das Feld "key" ja nicht, um die Annotation drauf zu setzen. Was muss man da statt dessen machen?

    Gruß ngomo
    http://www.winfonet.eu

  • #2
    Bei dieser Konstruktion bist du ja gezwungen den Konstruktor zu überschreiben:

    StringKeyedEntity(String key) {
    super(key);
    }

    Ev. wäre möglich

    @length(...)
    private String subKey;
    StringKeyedEntity(String key) {
    super(key);
    this.subKey=key;
    }

    Ist irgendwie nicht schön...
    Christian

    Comment


    • #3
      Um extra Code in den Subklassen kommt man wohl nicht herum...

      Hallo Christian,

      Bei dieser Konstruktion bist du ja gezwungen den Konstruktor zu überschreiben:
      Stimmt, hab ich genauso gemacht.

      Ich hab jetzt nochmal mit anderen Suchbegriffen gegoogelt. Um etwas Extra-Code kommt man wohl nicht herum. Ich hab u.a. das gefunden: http://stackoverflow.com/questions/2...tor-annotation

      Nicht ganz so, aber so ähnlich mache ich es jetzt.
      1. Das key-Feld in AbstractKeyedEntity bleibt private
      2. Ich schreibe dafür einen getter "protected final K getKey()"
      3. In StringKeyedEntity schreibe ich einen getter "public final String getName()", der "super.getKey()" aufruft.
      4. In LongKeyedEntity schreibe ich einen getter "public final Long getNumber()", der "super.getKey()" aufruft.
      5. Auf die beiden public getter setze ich meine Validierungsannotationen.

      Erst fand ich es ein bischen blöd, dass ich zwei zusätzliche getter brauche. Schließlich war es ja der Sinn meiner Superklasse, Code zu sparen. Inzwischen finde ich es aber ganz gut. Durch die Namen der getter wird nach außen deutlich, was die Werte für eine fachliche Bedeutung haben. Das war bei getKey() nicht so.

      Ein anderer Ansatz wäre der Einsatz eines Class-Level Validators gewesen. Aber dazu hatte ich keine Lust. Ich finds so schöner.

      Dank und Gruß, ngomo
      Zuletzt editiert von ngomo; 28.01.2011, 14:39. Reason: protected is besser
      http://www.winfonet.eu

      Comment

      Working...
      X