【问题标题】:How do I implement logging in an enum singleton?如何在枚举单例中实现日志记录?
【发布时间】:2026-02-18 22:15:02
【问题描述】:

我正在使用枚举单例,但实现日志记录很麻烦。这个:

public enum Foo {
  INSTANCE;

  private final Logger log = Logger.getLogger(Foo.class.getName());

  ...
}

记录器的实例化方式与我为普通 Java 类实例化记录器的方式相同,但是我当然会收到以下错误:

Foo.java: illegal reference to static field from initializer 

有没有等效的登录枚举单例的方法?

【问题讨论】:

    标签: java logging enums singleton


    【解决方案1】:

    回答您的问题,只需将记录器设为静态...

    顺便说一句,我认为即使是对象实例也使用静态记录器是标准做法。换句话说,记录器在课堂上;所有对象都使用静态记录器引用。

    http://logging.apache.org/log4j/1.2/manual.html

    其中大多数使用记录器的示例都将记录器作为静态属性...

    【讨论】:

    【解决方案2】:

    动态记录:

    Logger.getLogger(Foo.class.getName()).info("log info");
    

    【讨论】:

    • 如果你使用 IDE,那真的不是。给自己设置一个模板。在 Eclipse 中,我使用“日志”将快速调试日志条目扩展到此模板中。
    • 这种方法有什么好处?
    • 实例对 IOC 友好,可用于为服务器中的每个应用程序定义不同的日志记录环境。速度稍慢,但有某些优点(以及其他缺点)。
    【解决方案3】:

    短一点:使用方法:logger().debug(...)

    private static Logger logger()
    {
        if(logger == null)
        {
            logger = Logger.getLogger(AnEnum.class);
        }
    
        return logger;
    }
    
    /** Logger **/
    private static Logger logger;
    

    【讨论】: