如何在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 可能会对它进行足够的优化,以至于这个版本和假设的缓存版本之间的差异可以忽略不计。此外,与检索记录器相比,任何性能瓶颈更有可能出现在记录日志的行为中。
我的建议是对您的应用程序进行概要分析,看看它是否真的产生了足够大的影响。
为了轻松地为我的多个项目 类 启用日志记录,我决定滥用新的 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 可能会对它进行足够的优化,以至于这个版本和假设的缓存版本之间的差异可以忽略不计。此外,与检索记录器相比,任何性能瓶颈更有可能出现在记录日志的行为中。
我的建议是对您的应用程序进行概要分析,看看它是否真的产生了足够大的影响。