2013-01-24 4 views
8

ドメインオブジェクトをシステムの他の部分に渡す前に、ドメインオブジェクトを検証したいと考えています。検証したいすべてのオブジェクトが同じインターフェイスを共有しています。問題は、私がこれを良い方法で書く方法を理解することができないということです。私は自分のバリューオブジェクト内で検証を移動したくありません。しかし、私はinstanceOf-checkのどちらかを強制的に実行することは望ましくありません。Javaの値オブジェクト(継承)を検証する

例:Scalaで

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); 
} 

私はhttp://debasishg.blogspot.se/2010/06/scala-implicits-type-classes-here-i.html に似た何かをやっているだろう。しかし、これらの言語は、Javaで可能ではない構築。

+2

あなたは、実行時に動的にバリデータの適切な方法にバインドされる車両にコールバックコードのほんの少しを追加する必要があります[*訪問者パターン*](http://en.wikipedia.org/wiki/Visitor_pattern)について。 –

+0

バリデーションメソッドを値オブジェクトに入れないのはなぜですか?つまり、インタフェース階層を整理しても、値オブジェクトの自然な階層をサポートするために、バリデータ実装を連鎖させる必要があります。 – Perception

+0

このシナリオでinstanceOfを使用しない理由は何ですか? – Zylth

答えて

0

あなたの最善の策は戦略パターンですが、これでinstanceof/isAssignableFromチェックを行うことができなくなります。しかし、あなたがそれをうまく構築すれば、少なくともいくつか抽象化することができ、一般的に扱うことができます。追加の車両タイプを追加すると追加のチェックを追加する心配もありません。

私はStrategyパターンを説明するために行くことができるが、それはここではより良い行われています:http://www.javacodegeeks.com/2012/04/strategy-pattern.html(春と)

多くのフレームワークは、これを容易にするために、アウトオブボックスのクラスを持つことになります。

2

これは、Double Dispatchデザインパターンの古典的なケースです。あなたが求めているようですが、たくさんの音

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

しかし、問題のコードから、検証は車両のサブタイプに特有です。 @テーラーOMG。 – Taylor

+0

これがこのコードの機能です!私はコードを編集し、メソッド名を変更し、明確にするためにコメントを追加しました – Bohemian

+0

私は何かを見逃しているに違いない、私は今それを見る。私のderp。 – Taylor

関連する問題