問題タブ [effective-java]
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ジェネリックのextendとsuperの違いを誰かに説明してもらえますか?
関連する投稿を読みましたが、完全には理解できませんでした。リアルタイムの例で説明していただければ、とても助かります。
PECS(プロデューサ・ユー・エクステンド、コンシューム・ユー・スーパー) とはどういう意味ですか?
java - Eclipse のジェネリック型のオートコンプリート
効果的な Java で説明されているように、「インターフェイスによってオブジェクトを参照する」ことは良い習慣です。たとえば、私は好きです
以上
私のコードで。厄介なことの 1 つはArrayList<String> al = new
、Eclipse で入力してから Ctrl+Space を押すとArrayList<String>()
、プロポスタルとして表示されることです。しかし、List al = new と入力してから Ctrl+Space を押すと、匿名の内部クラスを定義するための提案のみが取得されますがnew ArrayList<String>()
、99% の場合、またはたとえば newなどの提案は取得されませんVector<String>()
。
質問: ジェネリック型のプロポスタルとしてサブクラスを取得する方法はありますか?
java - 効果的なJavaの本で説明されているように、Javaでの非静的メンバークラスの作成を理解する
以下はEffectiveJavaからのものです。
非静的メンバークラスインスタンスとそれを囲むインスタンスの間の関連付けは、前者が作成されたときに確立されます。それ以降は変更できません。通常、関連付けは、囲んでいるクラスのインスタンスメソッド内から非静的メンバークラスコンストラクターを呼び出すことによって自動的に確立されます。まれではありますが、式enclosingInstance.new MemberClass(args)を使用して手動で関連付けを確立することができます。ご想像のとおり、関連付けは非静的メンバークラスインスタンスのスペースを占有し、その構築に時間を追加します。
Blochがここで言っていることは、「まれですが、式enclosingInstance.new MemberClass(args)を使用して手動で関連付けを確立することは可能です。ご想像のとおり、関連付けは非静的メンバークラスインスタンスのスペースを占有し、その建設。」?
java - いくつかのコードをtrycatchブロックに入れると、JVMが最適化を行うのをどのように防ぐことができますか?
効果的なJavaの例外の章から:
try-catchブロック内にコードを配置すると、最新のJVM実装が実行する可能性のある特定の最適化が禁止されます。
try-catchブロックがJVMによる最適化を妨げる理由と方法は?
java - Unchecked Exceptions を文書化するための効果的な Java のヒントを理解する
効果的なJavaから「各メソッドによってスローされたすべての例外を文書化する」
各メソッドがスローする可能性のある未チェックの例外をすべて文書化することは理想的であり、現実の世界では常に達成できるとは限らないことに注意してください。クラスがリビジョンを受けるとき、エクスポートされたメソッドが変更されて追加の未チェックの例外がスローされても、ソースまたはバイナリの互換性に違反することはありません。クラスが、独立して作成された別のクラスからメソッドを呼び出すとします。前者のクラスの作成者は、各メソッドがスローするすべての非チェック例外を慎重に文書化するかもしれませんが、後者のクラスが修正されて追加の非チェック例外がスローされる場合、前者のクラス (修正されていない) が伝播する可能性が非常に高くなります。宣言されていなくても、新しい未チェックの例外。
以前のクラスが新しいチェックされていない例外をどのように伝播できるかを理解できませんか? Java 言語では、呼び出し元が未チェックの例外をキャッチして伝播することを義務付けていません。
java - 効果的な Java。複製可能なインターフェース
私はEffective Javaの本を読みましたが、Clonableインターフェースを説明している段落が1つ理解できません。誰かが私にこの段落を説明できますか:
...プログラマーは、クラスを拡張してサブクラスから呼び出す場合
super.clone
、返されるオブジェクトはサブクラスのインスタンスになると想定しています。スーパークラスがこの機能を提供できる唯一の方法は、 を呼び出して取得したオブジェクトを返すことsuper.clone
です。clone メソッドがコンストラクターによって作成されたオブジェクトを返す場合、そのオブジェクトのクラスは間違っています。
ありがとう。
java - 整数オーバーフローで比較可能なインターフェイスの最初のプロビジョニングに違反する方法は?
java.lang.Comparable#compareTo
メソッドは最初のプロビジョニングとして述べています
実装者は、すべてのxとyに対してsgn(x.compareTo(y))== -sgn(y.compare- To(x))を確認する必要があります。(これは、y.compareTo(x)が例外をスローする場合にのみ、x.compareTo(y)が例外をスローする必要があることを意味します。)
項目12のEffectiveJavaのJoshuaBlochによると
このトリックはここではうまく機能しますが、細心の注意を払って使用する必要があります。問題のフィールドが負でないことが確実であるか、より一般的には、可能な最小フィールド値と最大フィールド値の差がInteger.MAX_VALUE(231-1)以下であることが確実でない限り、これを使用しないでください。このトリックが常に機能するとは限らない理由は、符号付き32ビット整数が2つの任意の符号付き32ビット整数の差を保持するのに十分な大きさではないためです。iが大きな正の整数で、jが大きな負の整数の場合、(i --j)はオーバーフローし、負の値を返します。結果のcompareToメソッドは、一部の引数に対して誤った結果を返し、compareToコントラクトの最初と2番目の規定に違反します。これは純粋に理論的な問題ではありません。実際のシステムで障害が発生しています。これらの障害はデバッグが難しい場合がありますが、
整数がオーバーフローすると、最初の規定に違反する可能性があり、その方法がわかりません。この例は、最初の規定に違反する方法を示しています。
だから私はそれを得るためにvalue1
とが欲しいvalue2
ですか?何か案が?またはジョシュアは間違っていましたか?
java - すべてのクラスを不変にする必要がありますか?
私はEffectiveJavaを読み、そこに
クラスを不変にすることができない場合は、その可変性を可能な限り制限してください...
と
...非ファイナルにするやむを得ない理由がない限り、すべてのフィールドをファイナルにします。
したがって、すべてのPOJO(たとえば、、およびフィールドを含む単純なクラス)クラスを常に不変にする必要がありますかBook
?また、オブジェクトの状態を変更したい場合(たとえば、ユーザーが多くの本を表すテーブルでオブジェクトを変更した場合)、セッターの代わりに次のようなメソッドを使用します。ID
Title
Author
しかし、私は本当に良い考えではありません。
クラスを不変にするタイミングを教えてください。
java - コア Java の他の関連クラスで共有されている不変クラスの内部の例
不変クラスの多くの利点の 1 つは、それらの内部を他の関連するクラスで何らかの方法で実際に共有できることです。
コアJavaライブラリからのこの手法の例として何を引用できますか? なぜこのテクニックが機能するのですか?
編集: これは、実際にオラクルのインタビューで私に尋ねられました。
java - int 列挙型パターンがコンパイル時の定数であるとはどういう意味ですか?
これはEffective Javaからのものです
int 列挙型パターンを使用するプログラムは脆弱です。int 列挙型はコンパイル時の定数であるため、それらを使用するクライアントにコンパイルされます。
int enum パターンがコンパイルされた型定数と呼ばれる理由と、クライアントにコンパイルされることの意味を説明できる人はいますか?
このような定数の例を次に示します。