-4

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

  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 会再次阻碍我的表现?

4

1 回答 1

0

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

话虽如此,这可能不像乍看之下那么大。

如果您的日志记录足以使其成为问题,那么 JVM 可能会对其进行足够优化,以使该版本与假设的缓存版本之间的差异可以忽略不计。此外,任何性能瓶颈更有可能发生在记录日志的行为中,而不是检索记录器中。

我的建议是分析您的应用程序,看看它是否真的有足够的影响值得担心。

于 2015-02-25T20:17:46.517 回答