gpt4 book ai didi

java - 在java中验证值对象(继承)

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:56:03 26 4
gpt4 key购买 nike

我想在将域对象传递到系统的其他部分之前验证它们。我要验证的所有对象都共享同一个接口(interface)。问题是我无法弄清楚如何以一种好的方式编写它。我不想将验证移到我的值对象中。但我也不想被迫进行 instanceOf 检查。

一个例子:

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

在 Scala 中我会做类似于 http://debasishg.blogspot.se/2010/06/scala-implicits-type-classes-here-i.html 的事情但是这些语言结构在 Java 中是不可能的。

最佳答案

这是 Double Dispatch 的经典案例设计模式。

您需要在车辆中添加一小段回调代码,它将在运行时动态绑定(bind)到 validator 的适当方法:

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

关于java - 在java中验证值对象(继承),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14508979/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com