如何创建静态java API?

jac*_*ack 2 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();
}
Run Code Online (Sandbox Code Playgroud)

}

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

Aar*_*lla 6

这基本上是"全局变量"的变体,问题总是一样的:你只能有一个.如果你需要更换或扩展它,很多代码都会破坏.

其他日志框架使用工厂的原因:

 private final static Logger log = LoggerFactory.getLogger( Foo.class );
Run Code Online (Sandbox Code Playgroud)

这样,我有一个全局变量(在你的情况下,而不是几十个).这不是理想的,但至少给我一点失败.

这种方法允许我Logger用几乎任何东西扩展/替换接口,而不必更改代码中的数百个位置.

那说:不要编写自己的日志API.使用slf4j.你需要花费更长的时间来理解它是如何工作的,但许多聪明的人花了数年时间来构建一个伟大的日志框架,解决了你不了解的数千个问题.

编辑

它不是一般的登录工具.但更多的是生成Business Word文档的"Reporter类".

然后看看静态导入.

我建议公开一个getInstance()方法,但给这个方法一个更有用的名称.然后,您可以在其他地方静态导入此单个方法,并在没有LogUtil.前缀的情况下调用它.