2016-08-05 10 views
1

最近、私は可能な限りstaticのもの(変数とメソッド)を削除し、より良いコーディング慣行で置き換えることを試みる、鉱山のJavaコードを再構築しました。リフレクションVSスタティックstuff

私はまた、反射を勉強し始め、それがstatic呼び出しや参照を最初に、私は唯一の実現可能性(あるいは、少なくとも、それは私がそれを見る方法です)、いくつかのものを行うために私を可能にすることに気づきました。

しかし、私はstaticの使用はあまり推奨されていないことを読んできましたが、それは反射と同じではないようです。

staticというメソッドを作成してClassName.methodName()のように呼び出すのではなく、それをインスタンスメソッドにしてjava.lang.reflect.Method.invoke()で呼び出すのは正当な使用ですか?動的クラスのコンテンツにアクセスする


よう


ここでのサンプルコードです:動作します(しかし、私は方法staticをしたくない)

仮定の状況:

import static java.lang.System.out; 


public class Foo 
{ 
    private static boolean light; 


    public Foo() 
    { 
     turnOn(); 
    } 

    public static void turnOn() 
    { 
     light = true; 
    } 

    public static void turnOff() 
    { 
     light = false; 
    } 

    public static boolean isGreenLight() 
    { 
     return light; 
    } 
} 

public class Boo 
{ 
    public Boo() 
    { 
     if (Foo.isGreenLight())  // I need to access Foo.isGreenLight() from here, but cur- 
     {        // rently that method is not static (it should be to do so) 
      out.println("Ok!"); 
     } 
    } 
} 

public final class Main 
{ 
    public static void main(String[] args) 
    { 
     final Boo boo = new Boo(); 
    } 
} 

催奇形また、(それはリフレクションを使用しているだろうか)動作するはずン:

import static java.lang.System.out; 
import java.lang.reflect.Method; 


public class Foo 
{ 
    private boolean light; 


    public Foo() 
    { 
     turnOn(); 
    } 

    public void turnOn() 
    { 
     this.light = true; 
    } 

    public void turnOff() 
    { 
     this.light = false; 
    } 

    public boolean isGreenLight() 
    { 
     return this.light; 
    } 
} 

public class Boo 
{ 
    public Boo() 
    { 
     if ((boolean) Class.forName("Foo").getMethod("isGreenLight", null).invoke(new Foo(), null)) 
     { 
      out.println("Ok!"); 
     } 
    } 
} 

public final class Main 
{ 
    public static void main(String[] args) 
    { 
     final Boo boo = new Boo(); 
    } 
} 

の予想される出力(未テスト):

OK!

+1

呼び出しを行う方法(直接対反射)の問題ではなく、メソッド*自体を非静的に変更することについての質問です。ダイレクトコールをリフレクションコールに変更するだけで、そのメソッドを静的メソッドとして残しておけば、コードは*悪化しました!! * – Andreas

+1

「そのメソッドから値を取得する」とはどういう意味ですか? ?返される値を取得しますか?たぶんあなたはいくつかのコードサンプルを与えるべきです。 –

+0

@Andreasはい、私は非静的にメソッドを変更し、Reflectionによってそれにアクセスするという事態について話しています。 –

答えて

4

反射を使用することは、特にあなたが書いているものの背後にある意図がそれを保証していない場合は、コードの匂いです。

コードを見ずに言い表すのは難しいですが、それはちょっと推測です。

私はなります

  • は、あなたが最初の場所

  • でこれらのstaticメンバーを持っていた理由の背後にある理由を列挙static修飾子は、実際には最初の場所では正しい判断だったかどうかを判断:すなわちこれらはインスタンスメンバーかクラスメンバーですか?問題のクラスの「クライアント」は、それらをどのように使用するのでしょうか?どのようなパラダイムを使用していますか?機能的またはオブジェクト指向のコード。 DRY、SOLID、KISSプログラミングの慣行を満足していますか?

  • は、私が最初の場所

    さらに重要な

にオーバーエンジニアリングだ場合考慮します

  • 私はテストあなたのデザインを駆動する最初を通じて、私のコードを設計しますAPIをユーザの目で見ることができます。また、実装する前にテストカバレッジを持つという利点もあります。このようにしてコードを書くときに、デザイナーではなくユーザーの視点から考えると解決策がより明白になるので、私はそのような質問をしばしば排除します。それは、建築設計の目標と哲学を満足させるのではなく、プラグマティズムの問題になります。
+0

私は、あなたが最初のポイントをアベレージ・アベレージしているかどうかはわかりません。私は '静的'がOPによって過度に使用されていると感じますが、私はそれは例なしで伝えるのが難しいことを認めます。 –

+0

設計上の決定を過大に工学的にするのはどうでしょうか? –

+0

私のコメントがあいまいであれば申し訳ありません。私はこれがオーバーエンジニアリングではないと確信していました。私はちょうどあなたの3番目のポイントを参照しました。私は本当にあなたの答えに完全に同意します。 –

関連する問題