我看到有人编写了一个java LOG API,就像代码unerneath一样。 这个想法是客户端不必每次都调用LogUtil.getInstance()。 但我的感受是这不是惯用的java吗?
public class LogUtil{
private static LogUtil instance;
private Object current;//some Logger
private static LogUtil getInstance(){
if(instance == null){
instance = new LogUtil();
}
return instance;
}
private static void debug(String text){
}
public static LogUtil init(){
//dosomething with
// getInstance().current;
return getInstance();
}
public static LogUtil logSomething(String text){
//dosomething with
// getInstance().current;
return getInstance();
}
public static LogUtil anotherMethod(String text){
//dosomething with
// getInstance().current;
return getInstance();
}
}
反对这种设计的理由是什么(使每个方法都是静态的)?
答案 0 :(得分:6)
这基本上是“全局变量”的变体,问题总是一样的:你只能有一个。如果你需要替换或扩展它,很多代码都会破坏。
为什么其他日志记录框架使用工厂:
private final static Logger log = LoggerFactory.getLogger( Foo.class );
这样,我有一个全局变量(在你的情况下不是几十个)。这不是理想的,但至少给我一点失败。
这种方法允许我用几乎任何东西扩展/替换Logger
接口,而不必更改代码中的数百个位置。
说:不要编写自己的日志API。使用slf4j。你需要花费更长的时间才能理解它是如何工作的,但许多聪明的人花了数年时间来构建一个伟大的日志框架,解决了你不了解的数千个问题。
修改强>
它不是一般的登录工具。但更多的是生成Business Word文档的“Reporter类”。
然后看一下静态导入。
我建议公开单个getInstance()
方法,但为该方法提供更有用的名称。然后,您可以在其他任何地方静态导入此单个方法,并在没有LogUtil.
前缀的情况下调用它。
答案 1 :(得分:0)
静态类是Helper类,对于你的LogUtil静态类我会声明所有返回void的方法:
public class LogUtil{
private static LogUtil instance = new LogUtil(); //Initialization here
private Object current;//some Logger
private static LogUtil getInstance(){
}
private static void debug(String text){
}
public static void init(){
//dosomething with
// instance.current;
}
public static void logSomething(String text){
//dosomething with
// instance.current;
}
public static LogUtil anotherMethod(String text){
//dosomething with
// instance.current;
}
}
但是我对这个设计不满意,使用LogUtil是根据配置首选项创建一个Logger,并返回它,它有实例方法,比如log4j,你可以有ConsoleLog,FileLog,RemoteLog等< / p>
答案 2 :(得分:0)
这个类的作者可能想要构建一个fluent interface,解释为什么getInstance
将被隐藏用于其他类的方法调用并解释返回类型不是无效。
这样做的好处是允许客户端使方法调用更清洁:
LogUtil.init().logSomething("something").anotherMethod("text");
整体减少到一行。
我不是在处理“静态”辩论,因为正如Aaron上面所说,static
通常经常不被推荐,因为它打破了灵活性/可扩展性并且是反OO。
答案 3 :(得分:0)
使方法静态的一个经验法则是:问自己“调用此方法是否有意义,即使尚未构建Obj?”如果是这样,它肯定是静态的。“ 在您的示例中,logSomething(),anotherMethod()等操作正在对实例执行某些操作。由于这些方法没有实例就没有意义,因此它们应该是非静态的。只有getInstance()方法应该是静态的。
使一切变为静态的主要缺点是您无法在运行时交换,覆盖或选择方法实现。这个主题讨论了静态的缺点:In Java, is there any disadvantage to static methods on a class?。