問題タブ [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.

0 投票する
8 に答える
21326 参照

java - パブリックスタティックファイナルアレイがセキュリティホールであるのはなぜですか?

効果的なjavaは言う:

//潜在的なセキュリティホール!

static public final Thing [] VALUES = {...};

誰かがセキュリティホールとは何か教えてもらえますか?

0 投票する
2 に答える
3012 参照

java - オブジェクトの防御コピーを作成するにはどうすればよいですか?

不変オブジェクトに可変フィールドを含む可変オブジェクトの防御コピーを作成するにはどうすればよいですか?

  • MutableObjectには、フィールドを設定できるコンストラクターがありません。
  • MutableObjectの現在の状態は、Immutable Objectにキャプチャされ、変更されないようにする必要があります。
0 投票する
3 に答える
903 参照

java - TDD と依存性注入による効果的な Java 項目 1 の適用性

私はEffective Javaを読んでいて、TDDと依存性注入に関連して、最初の項目「コンストラクターの代わりに静的ファクトリメソッドを使用する」に関していくつかの懸念があります。

この項目には、public/protected/default コンストラクターを持たないようにし、静的ファクトリーを使用して公開する必要があると書かれています。ファクトリに名前を付けることができる、サブタイプを返すことができる、冗長性を減らすことができるなど、静的ファクトリを使用することに関連するすべての利点に同意します。それを使用してクラスをモックすることはできません。静的ファクトリを持つクラスをモックすることはできません。そのため、テスト駆動開発の妨げになります。

2 番目の点として、彼は、今日のエンタープライズ開発ではほとんどのアプリケーションが何らかの依存性注入コンテナーを使用していることを見逃していたと思います。ですから、DI を使用して依存関係を注入できるのに、なぜそれを使用する必要があるのでしょうか。

DI と TDD を含む今日の Java エンタープライズ開発にどのように適用されるか説明してください。

0 投票する
3 に答える
470 参照

java - このクラスは完全に不変ですか?

有効な Java 項目 15 (可変性の最小化) で説明されているアドバイスに従って、可変クラスを不変クラスに変換しようとしています。私が作成したクラスが完全に不変かどうか教えてもらえますか?

可変クラス

フィールドクラス

不変クラス

ありがとう

シェカール

0 投票する
1 に答える
695 参照

java - クラス間で共有される関連定数のグループ化

有効な Java の項目 17 で、Josh Bloch は、静的メンバーをインターフェイスに配置する (およびそのインターフェイスを実装する) ことは、定数インターフェイスのアンチパターンとして知られる悪い習慣であると主張しています。

定数インターフェイス パターンは、インターフェイスの不適切な使用です。クラスが内部的にいくつかの定数を使用することは、実装の詳細です。定数インターフェイスを実装すると、この実装の詳細がクラスのエクスポートされた API に漏れます。クラスが定数インターフェースを実装することは、クラスのユーザーにとって重要ではありません。実際、それは彼らを混乱させることさえあります。さらに悪いことに、これはコミットメントを表しています。将来のリリースで定数を使用する必要がなくなるようにクラスが変更された場合でも、バイナリ互換性を確保するためにインターフェイスを実装する必要があります。非最終クラスが定数インターフェイスを実装する場合、そのすべてのサブクラスの名前空間は、インターフェイスの定数によって汚染されます。

など、Java プラットフォーム ライブラリにはいくつかの定数インターフェイスがあります java.io.ObjectStreamConstants。これらのインターフェイスは異常とみなされるべきであり、エミュレートされるべきではありません。

私はこの背後にある理由を理解し、完全に同意すると確信しています。

私の質問は次のとおりです: 関連する定数をグループ化することです (注: これらは列挙型には適していません。関連する定数 pi と e の数学の例を検討してください) 対インスタンス化不可能なクラスでは、値にのみアクセスすることをお勧めします。静的参照と静的インポートを介して、デフォルトのアクセス修飾子を使用して API からインターフェイスを非表示にし、実際にインターフェイスを実装することはありませんか?

なぜですか、そうでないのですか?プライベートコンストラクターを使用して定数グループ化タイプがインスタンス化されないようにする以外に、それらをクラスにグループ化する利点はありますか?

0 投票する
1 に答える
87 参照

java - スーパークラスへの新しいメソッドの追加とその結果生じる問題-可能性?

効果的なJava第2版の項目16、継承よりも構成を優先すると次のように述べられています

「スーパークラスが後続のリリースで新しいメソッドを取得し、サブクラスに同じシグネチャと異なるリターンタイプのメソッドを与えることができなかった場合、サブクラスはコンパイルされなくなります。

新しいスーパークラスメソッドと同じシグニチャとリターンタイプを持つメソッドをサブクラスに指定した場合は、それをオーバーライドすることになります。」

これらのケースが実際の状況で発生する可能性はどのくらいありますか?ここにいる誰かが実際のビジネスアプリの例を教えてもらえますか(必要に応じて専有情報を削除します)?

0 投票する
3 に答える
647 参照

java - Javaシリアル化

私はEffectiveJavaを読んでいることに出くわしたという疑問を投稿します。それが本当に単純で率直な疑問であるならば、私は謝罪します。したがって、項目74-Serializableを慎重に実装するで、プライベートフィールドとパッケージプライベートフィールドを使用してクラスに適切な情報隠蔽を実装した後でも、効果が失われる傾向があると彼は言っています。私が過去に読んだものは何でも、すべてのシリアル化は、オブジェクトをバイトストリーム形式に変換し、逆シリアル化後、同じオブジェクトが保持されます。このプロセスでデータの非表示をどのように失いますか?

0 投票する
4 に答える
1122 参照

java - ジェネリック型別のJava保存条件

私はEffectiveJavaを読んでいて、学んだことのいくつかを実行に移そうと決心しました。Multimap<?, Condition<?> > ワイルドカードがキーと値の両方で同じタイプになるが、異なる異なるタイプになる場所を効果的に作成しようとしています。

これが私が見ている本のアイテムです:アイテム29

私はそれを完全に複製しようとはしていません。大きな違いは、キーがリンクのように値を直接表していないことです。私の場合、キーは値の一般的なタイプを表します。

したがってmmap.put(Class<Integer>, ConditionMapping<Integer>) 、getを実行すると、ConditionMappingのジェネリック型がないため、チェックされていないキャスト警告が表示されます。

署名が必要なgetメソッドがあります<T> List<Condition <T> >(Class<T> type)

型消去のため、condition.valueが型Tであることを確認し、オブジェクトの新しいリストを作成する唯一のオプションはありますか?

チェックされていないキャスト警告を無視することもできますが、無視しようとしています。助言がありますか?チップ?トリック?

0 投票する
6 に答える
13257 参照

java - Joshua Blochによる効果的なJava:Item1-静的ファクトリメソッド

Joshua Blochの記事を読んでいて、Effective JavaItem1について質問がありStatic Factory Methodます。

引用[Bloch、p.7]

インターフェイスは静的メソッドを持つことができないため、慣例により、Typeという名前のインターフェイスの静的ファクトリメソッドは、Typesという名前のインスタンス化できないクラスに配置されます。たとえば、Javaコレクションフレームワークは、変更不可能なコレクション、同期されたコレクションなどを提供します。これらの実装のほぼすべては、インスタンス化できない1つのクラス(java.util.Collections)の静的ファクトリメソッドを介してエクスポートされます。返されるオブジェクトのクラスはすべて非公開です。

Ok。ソースコードを見ると、プライベートコンストラクターを持つjava.util.Collectionインターフェイスとjava.util.Collectionsクラス(インスタンス化できないクラス)があります。そして、インスタンス化できないクラスCollectionsには、Blochが言ったように、すべて静的メソッドがあることがわかります。しかし、ブロッホが言ったように、私は2つのクラス間の関係を見ることができません

インターフェイスは静的メソッドを持つことができないため、慣例により、Typeという名前のインターフェイスの静的ファクトリメソッドは、Typesという名前のインスタンス化できないクラスに配置されます。

  1. 誰かが私に明白なことを指摘できますか?

  2. 彼が言ったときそれはどういう意味ですか

返されるオブジェクトのクラスはすべて非公開です

ここでJavaソースを入手します:http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/Collection.java ?av = f

0 投票する
2 に答える
200 参照

java - classes managing own memory

Effective Java: Item 6: Eliminate obsolete object references.

Generally speaking, whenever a class manages its own memory, the programmer should be alert for memory leaks. Whenever an element is freed, any object references contained in the element should be nulled out.

I don't think I fully understood the description.

What are the examples of a class managing its own memory - I can think of array, list, maybe map.

Could anyone explain the item in somewhat more details it is there in the book? Thanks