2017-01-12 1 views
1

静的関数のみを持つクラスを作成したいと思います。私はまた、クラス関数が呼び出される前に特定の変数を初期化する必要があります。私は静的関数だけを使用しているので、それを行うためにコンストラクタを使用することはできません。静的関数のみを持つクラスで初期化中にエラーをキャッチする方法

次のようにSSLContextを設定しようとすると、エラーが発生します。未処理の例外タイプNoSuchAlgorithmException。私はこれにどのようにアプローチすべきですか?私はsetContext関数にtryキャッチを入れ、値をnullに設定することができます。コンテキスト変数がnullであることがわかった場合、私は自分の関数からエラーを投げます。 セイを仮想的に、テストは、私は私のモックアルゴリズムを渡したいながら:

public class HTTPRequest { 
    private static SSLContext context = setContext(); 
    private static SSLContext setContext() throws NoSuchAlgorithmException { 
     return SSLContext.getInstance("TLSv1.2"); 
    } 
} 

具体的にどのようにこの効果は、JUnitテストケースを書いている間のでしょうか?通常、これらの値はコンストラクタで設定します。次のように:HTTPRequest(String algo) { context =SSLContext.getInstance(algo); }しかし、今私はそれを行うことができなくなりますか?

+0

は、あなたは自分の質問に答えていないことがありますか? – bsiamionau

+0

@bsiamionau私は異なった意見を求めています。多分私は考えていないかもしれない何かがあるかもしれない – user1692342

+0

オクラホマ、私はあなたのポイントを持っています – bsiamionau

答えて

1

I can put a try catch in the setContext function and set the value to null, incase of an error. And if I notice somewhere that the context variable is null, I throw an error from one of my functions.

例外が発生するとすぐに問題を処理する必要があります。これはどこにでもそれを扱うことを忘れると副作用を避けます。

So now when I try to set the SSLContext in the following manner I get an error: Unhandled exception type NoSuchAlgorithmException. How should I approach this?

あなたが問題を扱う3つの方法があります。例外は処理を停止し、NoSuchAlgorithmExceptionがスローされたときに特定の処理を表示したり、実行しなければならないことをする必要がある場合、あなたがキャッチしなければならない

  • を例外と例NoSuchAlgorithmRunTimeExceptionのために、カスタムRuntimeExceptionを投げる:

    try { return SSLContext.getInstance("TLSv1.2"); } catch (NoSuchAlgorithmException e) { throw new NoSuchAlgorithmRunTimeException(e); }

このようにして、発信者側からどのように処理するかが分かります。あなたはNoSuchAlgorithmRunTimeExceptionをキャッチする必要があります。

  • Kayamanが示唆するように、一般的なRuntimeExceptionを投げ、例外が処理を停止する必要がありますし、NoSuchAlgorithmExceptionがスローされたときに特定の処理を実行するべきではないとした場合には十分です:

    try { return SSLContext.getInstance("TLSv1.2"); } catch (NoSuchAlgorithmException e) { throw new RuntimeException(e); }

  • の場合例外は無視されるべきです。例外がアプリケーションの動作を妨げてはならず、単にそれをキャッチして、あなたが正しいと考えるログレベルでログする必要があるからです。

    try { return SSLContext.getInstance("TLSv1.2"); } catch (NoSuchAlgorithmException e) { LOGGER.error("error during initialization",e); }

+0

詳細情報をありがとう。これはJUnitを使ってテストケースを書くときに効果がありますか?私が嘲笑アルゴリズムを渡したいと思っている間に、仮説的に言ってください。通常、これらの値はコンストラクタで設定します。次のようにします。 HTTPRequest(String algo){ context = SSLContext.getInstance(algo); } しかし、今私はそうすることができませんか? – user1692342

+0

あなたは歓迎です:)あなたは正しいです。とにかくjunitやrmockitoのような古典的なユニットテストツールではありません。あなたはこの制限を回避するためにPowermockを使用することができますが、私はそれが選択肢がないときにのみ使用する必要があるツールだと思う。あなたが自然にアルゴリズムを模擬したいのであれば、テスト可能なコードが必要です。 – davidxxx

+1

個人的には、静的初期設定を使わないようにデザインを変更します。 HTTPRequestがインスタンス化されたときにアルゴリズムがロードされるようにするには、ファクトリを使用してHTTPRequestインスタンスを作成します。次に、HTTPRequestインスタンスを作成するファクトリメソッドが呼び出されると、アルゴリズムがロードされたかどうかを確認できます。あなたがそれをロードしていない場合。工場を使用すると、コンストラクタで見ると驚くかもしれないいくつかのロジックを統合するので、コンストラクタでよりクリーンなようです。 – davidxxx

1

代わりに例外をキャッチし、チェックされていない例外(RuntimeExceptionなど)をスローします。

private static SSLContext setContext() { 
    try { 
     return SSLContext.getInstance("TLSv1.2"); 
    } catch (NoSuchAlgorithmException e) { 
     throw new RuntimeException(e); 
    } 
} 
1

あなたは、彼らが実行する前に、他の静的メソッドを呼び出します静的init()メソッドを作成することができます。

private static void init() { .. } 

public static void doSomething() { 
    init(); 
    // do the thing 
} 

また、クラスは非staticにし、シングルトンインスタンス経由でアクセスすることができます。

public class HTTPRequest { 
    public static HTTPRequest getInstance() { ... } 
} 

あなたはその後、通常のコンストラクタを使用することができます。 Kayamanの答え@

1

は完全に正しいですが、私はまた、静的変数を初期化するために、静的なブロックを使用することができアドバイスすることができます - それはコードの量を減らす:

public class HTTPRequest { 
    private static SSLContext context; 

    static { 
     try { 
      context = SSLContext.getInstance("TLSv1.2") 
     } catch (NoSuchAlgorithmException e) { 
      throw new RuntimeException(e); 
     } 
    } 
} 
1

I want to create a class which has only static functions.

Javaは唯一、何機能を持っていませんの方法

I also need to initialize certain variables before the class functions get called. Since I am using only static functions, I cannot use a constructor to do it.

どの程度ない?つまり、クラス内の通常のメソッドとインスタンス変数を使用します。あなたが別の方法で問題を抱えているという事実は、あなたが別の方向に進むべきであるという兆候と解釈することができます。

しかし、あなたが主張している場合は、これを行うことができます。あなたが必要とする主なツールは静的イニシャライザブロックです。このようなブロックには、クラスの静的メンバーを初期化するために、多かれ少なかれ任意のコードを含めることができます。あなたは初期化子ブロック内で例外をキャッチすることができ、あなたが未チェック例外を投げることができ、特に

public class HTTPRequest { 
    private static SSLContext context; 

    static { 
     try { 
      context = setContext(); 
     } catch (NoSuchAlgorithmException nsae) { 
      throw new RuntimeException(nsae); 
      // or maybe just eat it, but that would leave context null 
     } 
    } 

    private static SSLContext setContext() throws NoSuchAlgorithmException { 
     return SSLContext.getInstance("TLSv1.2"); 
    } 
} 

注:たとえば。そのようなイニシャライザがチェックされていない例外をスローした場合、クラスをロードする(または実際に初期化する)とExceptionInInitializerErrorがスローされます。

関連する問題