0

私のJavaソースコードの1つの方法では、同じコードブロックが何度も発生します。

<some code>
<some code>
<block of code>
<some code>
<block of code>
<some code>
<some code>
<some code>
<block of code>
<some code>
<some code>
<block of code>
<some code>
etc..

このコードブロックが行うことは、オブジェクトのどのプロパティが従うべきコードのターゲットであるべきかを見つけることです。より具体的には、ブロックの先頭に文字列「Object.property」があり、コードのタスクはそれを解析して、オブジェクト「Object」のタイプと「Object」のプロパティを見つけることです。 「プロパティ」です。それが行われ、ブロックが終了すると、実行は、オブジェクトのプロパティを使用して何かを実行し続けます。プロパティを比較に使用することも、何かを割り当てることもできます。

さて、私の問題は、このブロックを別のメソッド内に配置してコードを少し整理したいということです。その後、代わりに複数回呼び出すことができます。さらに、このブロックにバグが見つかった場合、それを修正するためにすべての発生を確認する必要はありません。1つの方法だけです。

だからこれは基本的に私がやりたいことです:

<some code>
<some code>
property = parse();
<some code>
property = parse();
<some code>
<some code>
<some code>
property = parse();
<some code>
<some code>
property = parse();
<some code>
etc..

property parse(){
 <block of code>
 return property;
}

さて、Javaにはポインタがないため、たとえば、この新しいメソッドから整数であるプロパティを返すことはできません。その整数のコピーが返され(値渡し)、残りのすべてのコードは、プロパティ自体ではなく、プロパティのローカル整数コピーを処理します。もちろん、プロパティが比較でのみ使用される場合はこれで問題ありませんが、コードの残りの部分で何かを割り当てたい場合は、機能しなくなります。

Javaコードを短縮できるように、スマートでシンプルな回避策はありますか?それを変更するときは、コードの一部を変更するだけで済みますか?

編集:

実際のコードを提供するために、toParseという名前の文字列を取得した後、別のメソッドに配置されていない場合、コードのブロックは次のようになります(この例では「niceShirt.size」のようになります)。

String[] parts = toParse.split('\\.');
if(pantsList.containsKey(parts[0])){
    if(parts[1] == "size") pantsList.get(parts[0]).size += 1;
    if(parts[1] == "daysWorn") pantsList.get(parts[0]).daysWorn += 1;
}
if(shirtsList.containsKey(parts[0])){
    if(parts[1] == "size") shirtsList.get(parts[0]).size += 1;
    if(parts[1] == "daysWorn") shirtsList.get(parts[0]).daysWorn += 1;
}
if(shoesList.containsKey(parts[0])){
    if(parts[1] == "size") shoesList.get(parts[0]).size += 1;
    if(parts[1] == "daysWorn") shoesList.get(parts[0]).daysWorn += 1;
}

このようなコードは何度も発生するので、次のようなメソッドが必要です。

String[] parts = toParse.split('\\.');
if(pantsList.containsKey(parts[0])){
    if(parts[1] == "size") return pantsList.get(parts[0]).size;
    if(parts[1] == "daysWorn") return pantsList.get(parts[0]).daysWorn;
}
if(shirtsList.containsKey(parts[0])){
    if(parts[1] == "size") return shirtsList.get(parts[0]).size;
    if(parts[1] == "daysWorn") return shirtsList.get(parts[0]).daysWorn;
}
if(shoesList.containsKey(parts[0])){
    if(parts[1] == "size") return shoesList.get(parts[0]).size;
    if(parts[1] == "daysWorn") return shoesList.get(parts[0]).daysWorn;
}

残りのコードで行う必要があるのは、次のとおりです。

parse(toParse) += 1;

..しかし、parse(toParse)はコピーであり、値による戻りであるため、これは機能しません。したがって、オブジェクトの実際のプロパティには何もしません。

これが問題の明確化に役立つことを願っていますか?

4

2 に答える 2

2

単純なインターフェイスを実装する匿名クラスのオブジェクトで、ゲッターとセッターをラップできます。

interface PropertyInfo {
    Object get();
    void set(Object value);
}

このparse()メソッドは、呼び出し元から渡された他のデータに基づいて、getの実行方法と、set操作の実行方法を知っているこのインターフェースの実装を返します。

private PropertyInfo parse(...) { // take some parameters
    // Find your getter and setter through reflection
    final Method getter = ...
    final Method setter = ...
    return new PropertyInfo() {
        public Object get() {
            // Use the getter
        }
        public void set(Object value) {
            // Use the setter
        }
    };
}

条件でプロパティを使用する必要がある場合は、次のようなものを使用します。

PropertyInfo p = parse(...); // pass whatever needs to be parsed
if (p.get() == 123) ...

プロパティを設定する必要がある場合は、次のように呼び出すことができます。

PropertyInfo p = parse(...); // pass whatever needs to be parsed
p.set(123);
于 2012-08-20T17:04:21.537 に答える
0

メソッドを無効にし、最初の引数を「ハンドル」オブジェクト(整数フィールドを持つ単純なオブジェクト)にします。そのオブジェクトは値によって渡されますが、その値は好きなだけ変更できます。

于 2012-08-20T17:04:36.143 に答える