0

私はいくつかのメソッドを持つクラスを持っています。ここで、古き良き「サブ関数」のように、メソッド A にのみ表示されるヘルパー メソッドを定義したいと思います。

public class MyClass {
    public methodA() {
        int visibleVariable=10;
        int result;
        //here somehow declare the helperMethod which can access the visibleVariable and just 
        //adds the passed in parameter
        result = helperMethod(1);
        result = helperMethod(2);
    }
}

helperMethod は MethodA によってのみ使用され、MethodA の宣言された変数にアクセスする必要があります。methodA 内で既に宣言されている多くのパラメーターを明示的に渡すことは避けてください。

それは可能ですか?

編集: ヘルパー メソッドは、1 か所だけが異なる約 20 行のコードの繰り返しを避けるために使用されます。そして、この 1 つの場所は簡単にパラメーター化できますが、これらの 2 つのケースでは、methodA の他のすべての変数は変更されません。

4

5 に答える 5

4

ローカル クラスを宣言して、そこにメソッドを配置することもできます。

public class Test {

    public static void main(String[] args) {
        final int x = 10;

        class Local {
            int addToX(int value) {
                return x + value;
            }
        }

        Local local = new Local();

        int result1 = local.addToX(1);
        int result2 = local.addToX(2);
        System.out.println(result1);
        System.out.println(result2);
    }
}

しかし、それは非常に珍しいコードです。通常、これは、一歩下がって設計を再検討する必要があることを示唆しています。実際に作成する必要がある別のタイプがありますか?

(別の型 (またはインターフェイス) が既に適切な署名を提供している場合は、代わりに匿名の内部クラスを使用できます。それはそれほど良いことではありません...)

于 2013-08-05T06:24:05.140 に答える
1

メソッドの先頭で宣言する変数を final としてマークできる場合 (初期化後に変更されないことを意味します)、以下のようにヘルパー クラス内でヘルパー メソッドを定義できます。上部のすべての変数は、コンストラクターを介して渡すことができます。

public class HelperClass() {
   private final int value1;
   private final int value2;
   public HelperClass(int value1, int value2) {
       this.value1 = value1;
       this.value2 = value2;
   }
   public int helperMethod(int valuex) {
       int result = -1;
       // do calculation
       return result;
   }
}

HelperClass のインスタンスを作成し、メソッド内で使用できます

于 2013-08-05T06:27:49.937 に答える
0

methodA() はメソッドではありません。戻り値の型がありません。

メソッドで宣言された変数に、別のメソッドから直接アクセスすることはできません。

それらを引数として渡すか、ヘルパーメソッドと一緒に独自のクラスで methodA を宣言する必要があります。

これはおそらくそれを行うための最良の方法です:

public class MyClass {

    public void methodA() {
        int visibleVariable=10;
        int result;

        result = helperMethod(1, visibleVariable);
        result = helperMethod(2, visibleVariable);
    }

    public int helperMethod(int index, int visibleVariable) {
        // do something with visibleVariable
        return 0;
    }
}
于 2013-08-05T06:22:54.123 に答える
0

それは不可能。また、デザインもよくありません。変数のスコープのルールに違反すると、コードがバグだらけになり、判読できなくなり、信頼性が低くなります。関連する変数が非常に多い場合は、それらを独自のクラスに入れ、そのクラスにメソッドを与えることを検討してください。

あなたが意味することがラムダ式に似ている場合、いいえ、これは現時点では Java では不可能です (ただし、できればJava 8では可能です)。

于 2013-08-05T06:21:39.167 に答える
0

いいえ、できません。

privateクラスで作業を行うメソッドを作成することをお勧めします。コードの作成者は、他のどのメソッドがそのメソッドにアクセスするかを制御できますprivate。さらに、privateメソッドは外部からアクセスできなくなります。

私の経験では、メソッドは変数のロードを宣言すべきではありません。その場合、設計に欠陥がある可能性が高くなります。private final定数について考えてみてください。それらのいくつかをクラスで変数として宣言できなかった場合。あるいは、OO を考えると、これらの変数を保持し、それらの変数の処理に関連する機能を提供するオブジェクトが欠落している可能性があります。

于 2013-08-05T06:27:09.517 に答える