2013-01-24 4 views
8

Voglio convalidare i miei oggetti dominio prima di passarli su un'altra parte del sistema. Tutti gli oggetti che voglio convalidare condividono la stessa interfaccia. Il problema è che non riesco a capire come scrivere questo in un buon modo. Non voglio spostare la convalida all'interno del mio oggetto valore. Ma non voglio essere costretto a fare un'istanza di controllo.Convalida gli oggetti valore (ereditarietà) in java

Un esempio:

public interface Vehicle {} 

public class Car implements Vehicle {} 

public class MotorBike implements Vehicle {} 

public interface VehicleValidator { 
    void validate(); 

} 

public class CarValidator implements VehicleValidator { 

    @Override 
    public void validate() {} 
} 

public class MotorBikeValidator implements VehicleValidator { 

    @Override 
    public void validate() {} 
} 

public void process(Vehicle vehicle) { 
    //TODO: validate vehicle 
    doSomething(vehicle); 
} 

In Scala avrei fatto qualcosa di simile a http://debasishg.blogspot.se/2010/06/scala-implicits-type-classes-here-i.html Ma quei costrutti del linguaggio non è possibile in Java.

+2

Suona un po' come si sta chiedendo su [* visitor pattern *] (http://en.wikipedia.org/wiki/Visitor_pattern). –

+0

Perché non vuoi mettere il metodo di validazione nell'oggetto valore? Allo stesso modo, anche se si pulisce la gerarchia dell'interfaccia, sarà comunque necessario associare le implementazioni del validatore, al fine di supportare la gerarchia naturale degli oggetti valore. – Perception

+0

Per curiosità, esiste un motivo per non utilizzare un'istanza in questo scenario? – Zylth

risposta

0

La tua migliore scommessa è un modello di strategia imo, tuttavia questo non ti porterà lontano dal fare l'instanceof/isAssignableFrom checks. Tuttavia, se lo costruisci bene, almeno puoi estrapolarlo, gestirlo genericamente, e non devi preoccuparti di aggiungere ulteriori controlli se aggiungi altri tipi di veicoli.

Potrei andare avanti a spiegare i modelli di strategia, ma è fatto meglio qui: http://www.javacodegeeks.com/2012/04/strategy-pattern.html (con molla)

Molti quadri avranno classi out-of-the-box per facilitare questo.

2

Questo è un caso classico per il modello di progettazione Double Dispatch.

è necessario aggiungere un po 'di codice di call-back nel veicolo, che sarà legato in modo dinamico per il metodo appropriato del validatore in fase di esecuzione:

public interface Vehicle { 
    void validate(Validator validator); 
} 

public class Car implements Vehicle { 
    public void validate(Validator validator) { 
     validator.validateCar(this); 
    } 
} 

public class MotorBike implements Vehicle { 
    public void validate(Validator validator) { 
     validator.validateMotorBike(this); 
    } 
} 

public class Validator { 
    public void validateCar(Car car) { 
     // validate a car 
    } 

    public void validateMotorBike(MotorBike motorBike) { 
     // validate a motorbike 
    } 
} 

public void process(Vehicle vehicle) { 
    Validator validator = new Validator(); 
    vehicle.validate(validator); 
    doSomething(vehicle); 
} 
+0

Ma dal codice nella domanda, la convalida è specifica del tipo di veicolo secondario. – Taylor

+0

@Taylor OMG. Questo è ciò che fa questo codice! Ho modificato il codice e modificato i nomi dei metodi e ho aggiunto commenti per aiutare a chiarire – Bohemian

+0

Devo aver perso qualcosa, lo vedo ora. Il mio derp. – Taylor