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

标签 java oop architecture

关闭。这个问题是opinion-based .它目前不接受答案。












想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它.

4年前关闭。




Improve this question




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

序列化并发送通用 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 为每种类型(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/

相关文章:

c# - 如何减少 Controller 和业务层服务中的构造函数参数数量?

javascript - Node.js HTTP 代理架构 : downloading big amount of data for client

java - ESAPI 日志注入(inject)

java - Java枚举vs迭代器vs For循环

java - 在 Java 中按升序对整数数组进行排序

c++ - 传递指向C++中另一个指针的 'const'指针

c# - 如何设计两个相似(但不完全)的类?

java - 比较java中的两个列表

java - 类 A 中的构造函数 A 不能应用于给定类型;

php - 从 PHP 类中的数据库中获取数据