2016-03-23 5 views
1

インターフェイスを実装する一連のユーティリティクラスを作成したいと思います。これを行うために、私はシングルトンパターンを使用します。しかし、これらのユーティリティクラスを静的メソッド呼び出しで使用することもできれば便利です。例えば:スタティックインターフェイスのマッチングによるJavaユーティリティのシングルトン

public interface IValidator<T> { 
    boolean isValid(T value); 
} 

public class StringValidator implements IValidator<String> { 
    public static final StringValidator instance = new StringValidator(); 

    @Override 
    public boolean isValid(final String value) { 
     return true; 
    } 
} 

上記は、以下のように、インターフェースを使用してユーティリティメソッドを呼び出すために私を可能シングルトンを提供する:

// Use case #1 
IValidator<String> validator1 = StringValidator.instance; 
validator1.isValid(""); 

// Use case #2 
StringValidator.instance.isValid(""); 

しかし、私はまた、内StringValidatorを使用できるようにしたいと思い以下、より簡潔な方法:

// Use case #3: How can I also allow this syntax? 
StringValidator.isValid(""); 

メソッドの名前を変更せずに上記の構文作業のすべての3つを作るために、Javaの方法はありますか? 「非静的メソッドのisValid(String)をstatic参照できませんメッセージで失敗している、しかし

public class StringValidator implements IValidator<String> { 
    public static final StringValidator instance = new StringValidator(); 

    @Override 
    public boolean isValid(final String value) { 
     return StringValidator.isValid(value); 
    } 

    public static boolean isValid(final String value, final Object... ignored) { 
     return true; 
    } 
} 

から:私が持っていた唯一のアイデアは、次のように、静的な定義に可変引数パラメータを追加しました型StringValidator "を返します。もう一度、私のユースケース構文の3つすべてをコンパイラに許可する方法がありますか?ありがとう。

+0

私はそうは思わないでしょう。一般に、これを処理する方法は、クラスからインスタンスを静的にインポートすることです。 –

+0

'StringValidator.instance.isValid(" ");'の何が問題になりますか? –

答えて

3

インターフェースは、あなたがシングルトンに

public class StringValidator { 
    public static boolean isValid(final String value) { 
     return ...; 
    } 
} 

をドロップすると、あなたがValidator<String>のインスタンスを必要なときの静的メソッドにメソッドハンドルを使用することができ、機能インタフェースの場合:

IValidator<String> validator1 = StringValidator::isValid; 
-1

私は考え出しました方法。コードを次のように変更します。

public interface IValidator<T> { 
    boolean isValid(T value, Object... ignored); 
} 

public class StringValidator implements IValidator<String> { 
    public static final StringValidator instance = new StringValidator(); 

    @Override 
    public boolean isValid(final String value, final Object... ignored) { 
     return isValid(value); 
    } 

    public static boolean isValid(final String value) { 
     return true; 
    } 
} 

3つすべての使用例がコンパイルされます。 Javaではユースケース#2の警告が生成されますが、実装クラスの唯一正常な使い方は#1と#3のケースだと思うので気にしません。

+1

それは良い方法のようには見えません: 'ignored'変数を導入することはコード臭です。コンパイラの警告を無視することは決して良い考えではありません。 – Tunaki

+0

Java言語全体がコードの匂いであることがわかりました。タイプイレージャーは、特に、悪臭の最も悪いものを生成します。 –

+0

@俊明私は、ユースケース#3を廃止しました(クラスとメソッド名の間に ".instance"と入力するだけです)。私はそれが良い解決策ではないことに同意し、将来の訪問者にこの技術の使用を避けるよう助言する。 –

関連する問題