2

I saw someone writing a java LOG API like the code unerneath. The idea is that the Client does not have to invoke LogUtil.getInstance() every time. But my feelings are this is not idiomatic 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();
}

}

What are the arguments against such a design (making every method static)?

4

4 に答える 4

0

静的クラスはヘルパー クラスです。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などを持つことができます.

于 2013-10-18T09:33:40.787 に答える
0

メソッドを静的にするための 1 つの経験則は、「Obj がまだ構築されていない場合でも、このメソッドを呼び出す意味があるか?」と自問することです。もしそうなら、それは間違いなく静的でなければなりません。" あなたの例では、logSomething()、anotherMethod() などの操作はインスタンスで何かを行っています。これらのメソッドはインスタンスなしでは意味がないため、非静的にする必要があります。getInstance() メソッドのみを静的にする必要があります。

すべてを静的にすることの主な欠点は、実行時にメソッド実装を交換、オーバーライド、または選択できないことです。このスレッドでは、静的の欠点についてよく議論されています。Java では、クラスの静的メソッドに不利な点はありますか? .

于 2013-10-18T09:51:30.637 に答える