1

Java プロジェクトに、値の 2D 配列を含み、それと対話するための便利なメソッドを提供するクラスがあります。Location オブジェクト (2 つの値を格納するだけ) を使用して、マッピング内のポイントにアクセスし、値を返します。Location オブジェクトがグリッドのマッピング内にあるかどうかをチェックする isValid() メソッドがあります。

public boolean isValid(Location loc) {
    try {
        // will throw an ArrayIndexOutOfBoundsException if not valid
        // occs is the 2D array within the class
        occs[loc.getX()][loc.getY()];
        return true;
    }
    catch (ArrayIndexOutOfBoundsException e) {
        return false;
    }
}

これで、比較を使用して値をチェックし、その場所がグリッド内に収まるかどうかを確認できることはわかっていますが、比較を実行する必要がなく、有効でない場所がチェックされるケースはほとんどないため、この方法の方が高速です。ただし、ここに問題があります。配列にアクセスする行によって返される値が割り当てられていないか、メソッドに送信されていないため、AssignmentOperators に関するエラーが発生します。それを一時値に割り当てるか、役に立たない方法で実行するのは簡単な修正であることはわかっていますが、どちらも私にとっては厄介な応急処置のように思えます。(さらに、前者は Eclipse から警告を引き出します。)

とにかく、これは優先度が低いですが、正直に言うと、このような簡単な実装ではこれほど単純なことは不可能であることに悩まされています。ありがとう!

4

2 に答える 2

2

比較を実行する必要がないため、これは高速です。

もちろん、「比較を実行する」必要があります。他にどのように機能する可能性がありますか?この点に関するあなたの推論は誤りです。したがって、あなたの質問は無効です。

于 2013-09-18T11:51:39.727 に答える
1

残念ながら、これはまさにJavaのやり方です。JLS セクション 14.8、式ステートメントから:

C や C++ とは異なり、Java プログラミング言語では、特定の形式の式のみを式ステートメントとして使用できます。Java プログラミング言語では「void へのキャスト」が許可されていないことに注意してください。void は型ではありません。したがって、次のような式ステートメントを記述する従来の C のトリック:

(空所)... ; // 正しくない!動作しません。一方、Java プログラミング言語では、式ステートメントで最も有用な種類の式をすべて使用でき、void メソッドを呼び出すための式ステートメントとして使用されるメソッド呼び出しを必要としないため、このようなトリックはほとんど必要ありません。トリックが必要な場合は、代わりに代入ステートメント (§15.26) またはローカル変数宣言ステートメント (§14.4) を使用できます。

彼らがなぜこのようなことをしたのか正確には明らかではありませんが、私の推測では、バグを減らすことを意図していると思います. たとえば、誰かが誤ってa == b;の代わりに書いた場合a=b;、コンパイラ エラーが発生します。まれに、実際にこの動作が必要な場合は、一時変数に明示的に割り当てる (またはメソッドなどに渡す) 必要があります。

于 2013-05-03T18:24:00.210 に答える