java - Java - 使用特定类型的接口
问题描述
考虑以下情况:假设我们有一个IRestaurant
和一个IBooking
接口。
那么我们就有了如下接口函数:
interface IBooking {
void reserve(IRestaurant restaurant);
}
但是,业务需求要求一个国家/地区的预订服务只能预订同一国家/地区的餐厅。然后说我们在美国:
class USABooking implements IBooking { ... }
class USARestaurant implements IRestaurant { ... }
在这种情况下,由于reserve()
inIBooking
接受 的任何实例IRestaurant
,因此USABooking
需要实现检查 the 的实例IRestaurant
以查看它是否是 a 的实例,USARestaurant
然后向下转换。但是,我们也可以这样做:
interface IBooking<R extends IRestaurant> {
void reserve(R restaurant);
}
class USABooking implements IBooking<USARestaurant> {
void reserve(USARestaurant restaurant) { ... }
}
这是执行类型限制的推荐方法吗?换句话说,这是否比对餐厅实例类型执行运行时检查更好?打字方法对我来说听起来不错,但我只是想确保它不会“炸毁”架构并导致误用或滥用,因为还有其他接口也需要这样的限制(例如 ICuisine) .
解决方案
这是另一种选择,因为我不明白为什么有USABooking
和USARestaurant
类:
考虑只有一个Booking
和Restaurant
类,其中Restaurant
提供了一个getCountry()
方法。另外,为了避免类的扩散,一个Booking
实例可能有类似的东西List<RestaurantBookingRule>
- 在这种情况下,将有一个单一的规则来检查Restaurant
. 例如:
public class Restaurant {
private final String country; // constructor omitted
public String getCountry() { return country; }
}
public interface RestaurantBookingRule {
public void validateRequest(Restaurant r); // throws exception if the rule is broken
}
public class RequiredCountry implements BookingRule {
private final String country; // constructor omitted
public void validateRequest(Restaurant r) {
if (!r.getCountry().equals(country))
throw ...
}
}
public class Booking {
private final List<RestaurantBookingRule> rules; // constructor omitted
public void reserve(Restaurant r) {
rules.forEach(r -> r.validateRequest(r));
...
}
}
然后:
Restaurant r1 = new Restaurant("USA");
Restaurant r2 = new Restaurant("CAN");
Booking usaBooking = new Booking(List.of(new RequriedCountry("USA"));
usaBooking.reserve(r1); // ok
usaBooking.reserve(r2); // throws exception
推荐阅读
- assembly - 是否可以在不运行程序的情况下找到“MOV RAX,qword ptr FS:[0x28]”的值
- python - os.replace() 和 os.rename() 的区别?
- oauth-2.0 - 在 oauth2-proxy 的上游服务中使用访问令牌进行授权?
- arrays - 如果具有相似的 id,请快速将结构模型更改为另一个模型
- java - Apache-Pulsar 模式没有方法 builder()
- node.js - 动态数据库连接续集
- node.js - 有没有办法从 Node fetch 请求公共网站的内部 API?
- keras - 如何训练具有多个值的输出模型
- sql - 按 A 列分组并计算 SQL 中 B 列的值计数
- python - 有没有办法将 fxml 加载到 jython 逻辑代码中?