优点和缺点:具有消息通知类型的枚举或类

时间:2017-11-25 14:03:51

标签: java oop architecture

请告知以下建筑解决方案的优缺点

序列化并发送一般NotificationMessage的NotificationSender

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

NotificationSender为每种类型序列化和发送不同的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));

谢谢

1 个答案:

答案 0 :(得分:3)

使用枚举。不要创建100个子类,除非它们具有不同的行为(即,它们会覆盖方法)。

具有许多常量的枚举在内存和执行方面非常便宜。拥有那么多课程并不便宜,当然也会让其他人更难使用API​​。

枚举是一个有限值集:任何具有枚举类型的变量都保证包含一个枚举常量(或null)。

可能与子类完成相同的事情,如果类是final和/或构造函数保持包私有,但即使这样,API的用户也永远不会完全确定哪些值是有效的,因为由于动态加载类的方式,无法绝对确定地列出类的所有后代。