Javaの - 変更オブジェクトの内部データ、または変更されたデータで新しいオブジェクトを作成します

ジェイク・ローレンス:

質問

Javaでは、それはより多くのオブジェクトの内部データを変更することが適当である、とするとき、それはより多くの変更されたデータを使用して新しいオブジェクトを作成するために、適切な場合、標準コードのスタイルとデザインの原則に従って?

たとえば、のは、私はx成分とyコンポーネントを保持しているいくつかのクラス、Vector2Dを、持っている、と私はそのベクトルを回転させるようにしたいとしましょう:

アプローチA

public class Vector2D{
    private int x;
    private int y;
    public Vector2D(int x, int y){
        this.x = x;
        this.y = y;
    }
    public void rotate(double angle){
        //code for finding rotated vector
        x = rotated_x;
        y = rotated_y;
    }
}

Vector2Dオブジェクトは、次いで、回転させることができ vector1.rotate(angle)

アプローチB

public class Vector2D{
    private final int x;
    private final int y;
    public Vector2D(int x, int y){
        this.x = x;
        this.y = y;
    }
    public Vector2D rotate(double angle){
        //code for finding rotated vector
        Vector2D rotated = new Vector2D(rotated_x, rotated_y);
        return(rotated);
    }
}

Vector2Dオブジェクトは、次いで、回転させることができ vector1 = vector1.rotate(angle)

これまでの調査結果

問題への私の研究は、これまでそのアプローチBはメソッドチェーン、例えば可能にするために有用であると信じて私をリードしてきましたvector1 = vector1.rotate(angle).scale(scalar)より多くの事の読みやすさの面で、それ自身の利点があり、。

また、私は私の質問でもある拡張子によって仮定ので、アプローチBは、オブジェクトの不変を行うことができますことを実現するために私をリードしてきました:

とき、それは特に、この例の場合には、オブジェクトの不変を作るために適切か?(べきでありなど、ベクトル、ポリゴン、一般的なポイントのためにすべてのこれらのタイプは不変で?)

編集:

この記事を作成している間、私は念頭に置いていたプロジェクトは、エンティティはポリゴンで表現され、およびベクターを使用して操作されているゲームです。

私は、Vectorやポリゴンデータがしかとにかく、論理スレッドによって変更されるべきであることを確認のクラスは、スレッドセーフで問題にすべきではないです作り、そのために意図されたアプリケーションを信じています。

これはまた、これらの操作は、潜在的にすべての単一のエンティティのために、1秒間に60回(すべてのゲームを動かして)行われていることができることを意味しています。これは、新しいオブジェクトを毎回インスタンスから任意のオーバーヘッドがすぐに追加できることを意味するのでしょうか?

Enno Shioji :

一般的には、オブジェクトは不変なっ好む必要があります。あなたが変更可能なオブジェクトのためにオプトインすることがあります理由は以下のとおりです。

  1. オブジェクトは状態がたくさんあるので、作成するのに費用がかかります。例えば、大規模な行列を想像してみてください。あなたが変異を許可しない場合は、行列に非常に高価かもしれたびに、複製する必要があります(参照pandas例えば-それは両方のオプションを提供しています)。
  2. それを不変を作ることはAPIは非常に直感的になります。また、これは、言語の歴史に少し依存しています。例えば、ほとんどのJavaなどのmutateコレクションではなくコピーを返すことでライブラリをソートします。あなたが実装しようとしている場合shuffle、あなたがコピーを返す場合、それは驚くべきことになるという理由だけで、あなたは(1)心配されていない場合でも、リストを変異させる方がよいかもしれません。

いくつかの言語やライブラリは、以前の状態を共有しながら変異は、オブジェクトの新しい「バージョン」を返した第3の方法は、(参照思い付いたこの)。この解き(1)は、それによって、あなたはたくさんのコピーのコストをかけず不変性から利益を得ることができます。いくつかは、(1)なくなって、親しみ以外の可変性のためのOPTに何らかの理由がなくなったので、あなたが実質的に常に不変性を選ぶべきではありません。この手段を主張しています。実際には、いくつかのアルゴリズムが変更可能な状態(例えば参照せずに表現するのは非常に難しいです、これを)。私たちは、おそらく可変の状態を持ち続けるでしょう。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=184571&siteId=1