java - 优点和缺点 : having Enum or Class for Message Notification types

标签 java oop architecture

请告知以下架构解决方案的优缺点

NotificationSender,序列化并发送一般NotificationMessage

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 为每种类型(SessionNotificationMessages 等)序列化并发送不同的NotificationMessage

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 个子类,除非它们具有不同的行为(即,它们重写方法)。

具有许多常量的枚举在内存和执行方面非常便宜。拥有这么多的类并不便宜,而且肯定会让其他人更难使用该 API。

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

如果类是最终类并且/或构造函数保持包私有(private),则可以使用子类完成同样的事情,但即便如此,API 的用户也永远无法完全确定哪些值是有效的,因为由于类的动态加载方式,无法绝对确定地列出类的所有后代。

关于java - 优点和缺点 : having Enum or Class for Message Notification types,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47486828/

相关文章:

ios - Cocos2d : Should I use only (id)init for initializing, 或者我可以使用 (void)onEnter 进行后期分配吗?

java - 列表上的 allMatch、anyMatch,无需创建流

java - Java 中的 SOAP 对象序列化

java - 如何使用接口(interface)和实现来处理类依赖

performance - 速度比较-解释语言中的程序与OO

php - 我应该将验证代码放在域模型中还是将其保留在外部?

c# - 3 层架构中的外部通信

java - Android findViewById 找不到资源

java - 将带有嵌套对象的 JSON 映射到 GSON

c# - 如何强制所有实现在其构造函数中调用特定方法