問題タブ [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 - 挿入されたオブジェクトに関連付けられた LinkedList 挿入
次のようなコードがあります。
そして term.add(anotherTerm)
、anotherTerm が... 別の Term オブジェクトのようなことをするたびに、anotherTerm は、term に挿入したものと同じものを参照しているように見えるので、anotherTerm を変更しようとするたびに term.get( 2) (たとえば) get も変更されます。
どうすればこれを防ぐことができますか?
コードが要求されたので:
挿入メソッドを呼び出すコード:
anotherTerm 用語を作成するコード:
insert メソッドを呼び出す新しいコード:
clone() has protected access in java.lang.Object
残念ながら、実行した後でも、これはまだ機能しませんpublic class Term implements Cloneable{
java - オブジェクトの防御コピーを作成するにはどうすればよいですか?
不変オブジェクトに可変フィールドを含む可変オブジェクトの防御コピーを作成するにはどうすればよいですか?
- MutableObjectには、フィールドを設定できるコンストラクターがありません。
- MutableObjectの現在の状態は、Immutable Objectにキャプチャされ、変更されないようにする必要があります。
java - 可変オブジェクトを読み取り専用オブジェクトにカプセル化する
私は現在、反復ソルバーを実装しています。これは、特定の問題に対するソリューションの推定値を連続的に改善することによって機能します。ソリューションはかなり大きなデータ セットであるため、その場で絞り込みが実行されます。
反復が行われている間にアルゴリズムを監視できるようにするために、単純な Observer/Observable パターンを実装しました。特に、ソルバーはメソッドを提供します。
解の現在の推定値を返します。オブザーバーは、現在の推定値に基づいて自由に計算を行うことができます (たとえば、解が十分であるかどうか、反復を停止できるかどうかを判断するため)。Foo
変更可能ですが、もちろん、オブザーバーが解の現在の推定値を変更すると、ソルバーの反復が台無しになる可能性があります。
したがって、getCurrentSolution()
実際には防御コピーを返す必要があります。しかし、これは大規模な問題では時間とメモリを必要とするため、新しいをgetCurrentSolution()
返すという別のアイデアを思いつきました。とほぼ同じインターフェースを持ち、データを変更する可能性のあるメソッドのみが「非アクティブ化」されます (例外がスローされます)。いくつかのダミー クラスのすべての詳細を以下に示します。ReadOnlyFoo(bar)
foo
ReadOnlyFoo
Foo
私の質問は次のとおりです。このアプローチは良い習慣ですか?より良いパターンはありますか?
ありがとう!セバスチャン
c# - コレクションを防御コピーと交換する
これは、 Effective C#の本で見た例です。
著者は、これは参照型ではなく値型で機能すると述べています。彼の意味が理解できませんでした。
私は今理解していると思います:コレクションはrefタイプです。「データフィールド」の利用者は、ヒープ上の古いストレージへのコピーを保持していることを覚えていません。「データ」が値タイプの場合、コンシューマー(データを使用する他のコード)は、データのディープコピーを保持していることを思い出し、更新が必要になったときに再度要求します。
右 ?
java - MyBatisを防御コピーで動作させる方法は?
この単純なスキーマを想定しましょう。
そして、MyBatisでのこのマッピング:
これが私のユーザーBeanの実装です:
したがって、ユーザーBeanの実装でロールリストから防御コピーを取得するという事実を除いて、すべてが非常に簡単です。問題は、MyBatisがこれをまったくサポートしていないようであり、結果のロールリストが空になることです。これらのコピーをとらないと、スムーズに動作しますが、デザインが悪くなります。これを回避する方法はありますか?
java - 不変クラスの防御的コピーについて
Immutableクラスの作成に関する質問があります。私が考慮している点は次のとおりです。
- クラスをファイナルにする
- すべてのメンバーをfinalにし、明示的に、静的ブロックで、またはコンストラクターで設定します
- すべてのメンバーを非公開にする
- 状態を変更するメソッドはありません
- 可変メンバーコンポーネントへのアクセスを制限するように細心の注意を払ってください(フィールドはfinalである可能性がありますが、オブジェクトは依然として可変である可能性があります。つまり、private final Date imStillMutable)-詳細については、防御コピーまたはその従兄弟コピーコンストラクターを参照してください。
でも、5点が全然わからなかったので、その例で5点がはっきりしている例を教えてください。
java - セットの一般的なコピーの作成コンストラクターで
この特定の質問に対する直接的な答えが見つからなかったので...クラスを想定します:
セットの正確な実装を気にせず、最小限のオーバーヘッドでコピーが必要なだけなので、基本的には initialTags の内部状態の直接コピーが必要です。clone
Set はインターフェイスなので、使用できません。これは可能ですか、またはnew HashSet<String>(tags);
タイプについて決定する必要があるようなものを使用する必要がありますか?
前提: セット項目タイプは不変に制限されています。呼び出し元が壊れた Set 実装を渡さないinitialTags
ことを信頼できます。また、このクラスで内部的に使用するのに十分なパフォーマンスが得られることを信頼できます。
リフレクションとclone()を試してみようと思っているのですが、これはちょっと汚いような気がします...
java - ストリームとプロセスの防御コピー
Process proc
エラーが発生した場合、破棄して再作成する必要がある実行中です。
これは、stdin を介して解決できないプロセスにコマンドを送信する際の問題が原因です。
私の回避策は、構築した「接続」(stdin、stdout、stderr) をリセットし、新しいプロセスから新しいストリームを取得することです。プロセスが終了したときに、スレッドを使用して監視しています。エラーが発生した場合は、quit コマンドを使用してプロセスをシャットダウンし、スレッドを中断して、最終的にストリームを閉じます。
メインスレッドはすでに新しい接続を構築しています。接続を再構築した後にコマンドを送信すると、ストリームが閉じていることを示す IOException が発生します。
古いストリームをコピーして後で閉じる方法はありますか? すでに別のリーダーでラップして試しましたが、成功しませんでした。getXXXStream() を介してプロセスのストリームを取得し、それらを閉じるだけで十分かどうかはわかりません。これは、上記のリーダーを閉じないためです。また、新しいプロセスを取得してストリームを閉じることもできます。
でもブロックしたくない。
編集:
私の最初のコメントが述べているように、私はすぐにストリームを閉じますが、問題はProcess
残ります。それが閉じて proc を新しいものに再割り当てするのを1000ミリ秒待っている場合Process
、私のスレッドは新しいスレッドで動作します(例: calls exitValue()
)。
これが私のスレッドです:
私の接続を構築する方法(接続+再接続):
objective-c - アクセサー メソッドでの Objective-C の防御的コピー
Java のバックグラウンドを持つ私は、Objective-C で防御的にプログラミングする方法を理解するのに苦労しています。SomeClassが変更可能でコピーメソッドを提供する
と仮定すると、これは Java で書く典型的なコードです。
私はそれを理解するのに少し時間がかかりました
customerList プロパティに割り当てる前に、setter の引数のコピーを作成します。私を混乱させるのは、適切なゲッターを書くことです。これまでのところ、次のようになります。
これは、self.customerList = ... のようなすべての内部メソッド呼び出しで機能しますが、セキュリティ違反を引き起こす外部呼び出しへの直接ポインターを渡します。コピーを返す別の public getter を提供することを検討していましたが、型にはまらない名前が必要になるため、これは避けたいと考えています。この状況をどのように対処しますか?
ありがとうございました。