如何创建静态java API?

时间:2013-10-18 09:28:19

标签: java

我看到有人编写了一个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();
}

}

反对这种设计的理由是什么(使每个方法都是静态的)?

4 个答案:

答案 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?