java - String(或 T)和 Enum 的父类(super class)

标签 java enums

我有一些小型日志系统,它可以处理String,一切正常。
现在我想添加功能来表明我想要一个新行,并且由于我的结构,我认为最好使用一个特殊的标志,一些示例代码:

public class BaseLogger implements Runnable, LogConsumer {
    //....
    private final BlockingQueue<String> queue;
    //....

    @Override
    public void run() {
        while (running) {
            try {
                if (consumers.isEmpty()) {
                    synchronized(consumersEmptyLock) {
                        consumersEmptyLock.wait();
                    }
                }
                String message = queue.take();
                for (LogConsumer consumer : consumers) {
                    consumer.consume(message);
                }
            } catch (InterruptedException ex) {
                handleInterrupt();
            }
            if (requestShutdown && queue.isEmpty()) {
                running = false;
            }
        }
    }

    public void log(String message) {
        if (message == null) {
            throw new IllegalArgumentException("customlogger.CustomLogger.log: message == null");
        }
        queue.offer(message);
    }

现在我想添加一个枚举,比如说 LogFlagEnum,其中包含一个名为 NEW_LINE 的标志。

但是目前我的queueString类型,我希望它同时包含String(或者也许T 以获得更一般的答案)和 LogFlagEnum

我知道我可以使用Object作为类型,但这不是最小的可能类型,并且绝对不安全,也是我想要的。

实现指定行为的最佳方式是什么?

最佳答案

解决方案1:使用Object.这没什么大不了的,因为它只是内部实现。

解决方案2:使用CharSequence;让枚举实现 CharSequence。不太有帮助。但总的来说,CharSequence 在接受文本参数方面比 String 更好。

解决方案3:Java中的每个问题都可以通过引入新类型来解决。您的队列可以是 LogEntry 的队列,并且 LogEntry 可以包含 String/enum/whatever。

关于java - String(或 T)和 Enum 的父类(super class),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20996001/

相关文章:

java - 为从 Java 应用程序查询 Google 的 URLConnection 设置 "User-Agent"参数

java - java中的阻塞

c++ - 已签名基础类型枚举的位域溢出

c++ - 使用枚举的一些很好的例子

types - 为什么编译器不警告强制转换为枚举?

c - C 枚举定义中的位移位有什么作用?

java - Resilience4j RateLimiter 似乎忽略配置

Java和虚拟内存ulimit

java - 如何从常量 java 为注释提供值

Java:是否允许在运行时更改 Enum 字段?