如何在Java接口默认方法中模拟静态变量?

How to simulate static variable in Java interface default method?

为了轻松地为我的多个项目 类 启用日志记录,我决定滥用新的 default 关键字为我的 类:[=16 创建一个简单的方法特征=]

  default void Log(Level lvl, String msg) {
    Logger log = Logger.getLogger(this.getClass().getName()); 
    //Log something
  }

我真正不喜欢的是每次都需要 log。如果我使用 C++,我会声明:

static Logger log = ...;

每隔一次对该函数的调用,记录器就已经在变量中进行了初始化。在正常的类中,我使用这个模式来模拟静态变量:

class A {
    //By default, this is null until needed
    private Obj cached_obj = null;
    public void doSomethingWithObj(Something thing) {
        //Once needed, it only initialises once
        if(cached_obj==null)
            cached_obj = Obj.generateObj();
        cached_obj.doSomething(thing);
    }
}

但这在界面上是不可能的。接口不能有任何属性。

那么还有其他解决方法吗,或者 Java 会再次阻碍我的表现吗?

确实没有办法缓存它,因为按照设计,接口没有与其关联的状态。

话虽如此,这可能并不像乍看起来那么严重。

如果您的日志记录足以使其成为一个问题,JVM 可能会对它进行足够的优化,以至于这个版本和假设的缓存版本之间的差异可以忽略不计。此外,与检索记录器相比,任何性能瓶颈更有可能出现在记录日志的行为中。

我的建议是对您的应用程序进行概要分析,看看它是否真的产生了足够大的影响。