1

Java でマッピング アプリを作成していますが、小さなオブジェクトの受け渡しについて質問があります。ウィンドウが長方形として表示している領域を表したいとします。どのタイルをロードするかを知るために、その長方形の内側にあるタイルを照会したいとします。C++ では、Rect構造体を作成してtileInRectメソッドをインクルードするだけです。Java への最も直接的な翻訳は次のようになります。

class Rect {
    float x, y, width, height;

    public boolean tileInRect(Tile t) {
        // yada yada
    }
}

class MyProgram {
    public void main(String[] args) {
        while (windowIsOpen()) {
            // event loop
            // render map
            Rect r = getVisibleRect();
            for (Tile t : tiles) {
                if (r.tileInRect(t)) {
                    // etc.
                }
            }
        }
    }
}

しかし、フレームごとに新しい Rect を作成すると思われるため、これは私にとっては不快に感じます。これらの軽量オブジェクトを Java で表現するための、より適切で標準的な方法はありますか? 私はヘルパーメソッドを書きたくありません.tileInRect(Tile t, int rect_x, int rect_y, int ...なぜなら、それはばかげた量のパラメータを渡すだけのように思えるからです. ありがとう!

4

2 に答える 2

0

不変クラス型または可変クラス型のいずれかを使用できます。.NET での理想的な表現は、公開されたフィールド構造 (必要な場合はほとんどのコンテキストで可変として動作し、必要な場合はほとんどのコンテキストで不変として動作します) ですが、Java はそのような概念をサポートしていないためです。それぞれの長所と短所を認識して、可変クラスまたは不変クラスのいずれかを使用する必要があります。

変更可能なクラスには、オブジェクトへの唯一の現存する参照があり、何らかの方法で異なるオブジェクトが必要であり、古いバージョンのオブジェクトが不要になった場合に、適切なオブジェクトを簡単に変更できるという利点があります。新しいオブジェクトを作成する必要がなく、変更したくないオブジェクトの部分をコピーしたり、何かをしたりする必要がありません。ミュータブル クラスには、オブジェクトへの唯一の現存する参照がある場合にのみそのようなミューテーションが安全であるため、オブジェクトへの参照を他のコードと安全に共有できないという欠点があります。代わりに、新しいオブジェクトを作成して他のコードに渡すか、自分のオブジェクトから他のコードが提供するオブジェクトにデータをコピーする必要があります。

不変クラスには、オブジェクトへの参照を外部コードと自由に共有できるという利点があります (オブジェクトは不変であるため、外部コードはオブジェクトに対して何もできません!)。残念ながら、外部からオブジェクトに対して何もできないことは素晴らしいことですが、不変性は、オブジェクトの論理的な「所有者」でさえオブジェクトに対して何もできないことも意味します。オブジェクトを持っていて、何らかの点で異なるオブジェクトを持ちたい場合は、その点で異なるまったく新しいオブジェクトを生成する必要があります。実際、宇宙のどこにいても、古いオブジェクトが変更されたかどうかを気にする人はいないとしても、通常、コードでそれを知る方法はありません。

コードがオブジェクトの変更された形式を他のコードと交換するよりも頻繁に生成する場合は、変更可能なクラス型が優先される場合があります。オブジェクトが頻繁に渡されるが、新しいフォームの生成が比較的まれである場合は、不変のクラス型が優先される場合があります。可変クラス型を不変クラス型でラップすることは可能 (かつ一般的) であることに注意してください。これは、ユニバースのどこにでもある「可変」オブジェクトへの唯一の参照を保持し、そのオブジェクトを変更することも、実行する可能性のあるものへの参照を公開することもありません。それで。実際には決して変化しない可変型のオブジェクトの用語があるかどうかはわかりませんが、それはしばしば便利なパターンです (主な例はString; Java の配列は可変ですが、String文字配列を変更したり、外部コードに公開したりすることはありませんString。オブジェクト内の文字のシーケンスが変更されることはありません。

于 2013-04-19T21:15:45.587 に答える