問題タブ [defensive-copy]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - コンストラクターへの参照パラメーターに関する防御的コピー
JAVAのクラスのコンストラクターへの参照パラメーターに関して、防御的コピーとは何か教えてください。
どうもありがとう
java - 古いデータを与える ArrayList にオブジェクトを追加する (BeanUtils を使用した防御的コピーによってコピーされる): Spring 3
CustomerDAO クラス:
メソッドではCustomerDTO getCustomer(int customerId)
、Spring を使用して CustomerDTO オブジェクトのコピーを返そうとしていますがBeanUtils.copyProperties(targetCustomer, origCustomer);
、これらのコピーされたオブジェクトをメソッドのリストに追加するList<CustomerDTO> getCustomerList(List<Integer> customerIds)
と、コメントに記載されているように奇妙な動作が発生します。削除している場合BeanUtils.copyProperties(targetCustomer, origCustomer);
、動作は正しいです。
テストケース:
コピーされたオブジェクト: BeanUtils.copyProperties(targetCustomer, origCustomer);
//spring BeanUtils
オブジェクトをコピーしない場合: BeanUtils.copyProperties(targetCustomer, origCustomer);
//spring BeanUtils
誰かがこの動作の何が間違っているか、または考えられる説明を説明してもらえますか?
更新: BeanUtils を使用する目的:
メソッドから CustomerDTO オブジェクトを返す前に、可変オブジェクトの防御コピーを使用しようとしていますgetCustomer()
。だから私はこの投稿に従って浅いクローニングを使用しようとします。
更新: 使用するのが間違っていたため、不変性という言葉を削除しました。
java - 不変フィールドではありますが、*非最終*で不変クラスを構築する防御的コピーが必要ですか?
不変クラスを構築したい場合は、非 final フィールドへの参照を公開しないでください。ただし、 Strings のような不変オブジェクトの場合でも?
java - 防御的プログラミングのさまざまなケースにどう対処するか?
これはEffective Javaでの防御コピーの例です。私の根底にある質問のシナリオには防御的なコピーが必要であり、渡されたオブジェクトの変更を避けるようにクライアントに要求するコメントには対応できないと仮定します。
質問:
Date
自分自身をより一般的にするために、自分自身を取り込むコンストラクターがなく、オブジェクトが渡され、それ自体を複製するメカニズムがなく、そのようなオブジェクトが私たちに属していない場合、つまり、変更できない場合はどうすればよいですか?コンストラクターが型パラメーターを引数として取り
Period(T object)
、T が変更可能である可能性があるため、防御コピーが必要な場合はどうなりますか。Tが何であるかはわかりません。この場合、防御的コピーを行うにはどうすればよいですか?Date
一部のサブクラスにはそれ自体のオブジェクトを作成するようなコンストラクターがあり、一部のサブクラスにはそうするメカニズムがない場合に渡されるインターフェイスとは何ですか?どのくらいの深さまで防御的にコピーする必要がありますか? 配列をコピーするとしましょうが、配列要素は変更可能でしたか?
java - "By" の複製: Selenium を使用した防御的プログラミング
だから私は、Selenium でテストしている Web サイト用の Panel オブジェクト API を書いています。これは、将来、私の管理外の多くの人々によって使用される可能性が高いため、防御的にすることもできると思いました (効果的な Java で見られる)。しかし、By のクローンを返すということになると、私は壁にぶち当たりました。
arrayList のようなメソッドを期待していました:
By は静的に作成されるため存在しません。さらに、 By を除いて、情報がそこにあると、 By から情報を取得する方法がわかりませんtoString()
。だから私は のパーサーを書くことができますBy.toString()
が、それは仕事が何であるかについて多くの努力のように思え、起動するのはあまりエレガントではありません.
セレンでByロケーターをクローンするより面倒でない方法を誰かが提案できますか?
java - このクラスをより不変にすることはできますか?
このクラスを不変にするためにできることは他にありますか? 文字列はすでに不変であり、セットは変更不可で返されます。tutees と name 変数はプライベートで最終的なものです。他に何ができるでしょうか?Tutor クラスを使用するクラスだけがパッケージ内にある場合、コンストラクター、getTutees メソッド、および getName メソッドを package-private に変更できますか?
編集:
これが Student クラスです。この質問では、Student を不変にするために必要な変更について説明するよう求められました。変数を final にできるように、両方のセッター メソッドをコメントアウトしました。これが真に不変にする唯一の方法ですか?
java - ソナー違反:Security-Array が直接保存されます
Sonar を使用してアプリケーションのコードを変更しようとしています。それを修正する方法とその理由は? ありがとう。
java - 別のユーザー定義クラスのメンバー変数がある場合、Java クラスを不変にするにはどうすればよいですか?
最近、Java 開発者の役割のインタビューで、クラス B のオブジェクトであるメンバー変数があり、クラス B がプロジェクトの外部にあり、編集できない状況で、クラス A を不変にする方法を尋ねられました。さらに、プログラマーはクラス B に、別のユーザー定義クラスのオブジェクトである独自のメンバー変数を持つことさえあります。よく考えて、クラス B がディープ クローン自体のメソッドを実装して公開しない限り、方法はないとインタビュアーに伝えました。
しかし、インタビュアーは納得していませんでした。そのようなクラスを不変にする方法は本当にありますか?
私の記憶が正しければ、これが彼が説明した状況でした。彼は私にクラス A を不変にすることを望んでいました。