请建议利弊,以遵循建筑解决方案
序列化并发送通用通知的通知
class NotificationSender {
public void send(NotificationMessage message) {
client.send(serializeToJson(message));
}
}
class NotificationMessage<E> {
E payload;
NotificationType type;
public NotificationMessage(payload, type) {
this.payload = payload;
this.type = type;
}
}
Enum NotificationType {
session, invite, etc, 100 more types...
}
NotificationSender.send(
new NotificationMessage<SessionDTO>(sessionDTO, NotificationType.session)
);
通知序列序列序列并为每种类型发送不同的NotificationMessage(SessionNotificationMessages等)
class NotificationSender {
public void send(NotificationMessage message) {
client.send(serializeToJson(message));
}
}
abstract class NotificationMessage<E> {
E payload;
}
class SessionNotificationMessage extends NotificationMessage {
static final String = "session";
public NotificationMessage(payload) {
this.payload = payload;
}
}
class InviteNotificationMessage extends NotificationMessage {
static final String = "invite";
public NotificationMessage(payload) {
this.payload = payload;
}
}
NotificationSender.send(new SessionNotificationMessage(sessionDTO));
NotificationSender.send(new InviteNotificationMessage(inviteDTO));
谢谢
使用枚举。不要创建100个子类,除非它们具有独特的行为(也就是说,它们覆盖方法)。
在记忆和执行方面,具有许多常数的枚举非常便宜。拥有很多课并不便宜,肯定会使其他人更难使用。
枚举是一个有限的值集:保证具有枚举类型的任何变量包含枚举常数之一(或null)。
可能可以使用子类完成同一操作,如果类是最终和/或构造函数保留的构造函数,但是即使如此,API的用户也永远不会完全确定哪些值是有效的,因为由于类动态加载了类的方式,因此无法列出具有绝对确定性的类的所有后裔。