Try using it in your preferred language.

English

  • English
  • 汉语
  • Español
  • Bahasa Indonesia
  • Português
  • Русский
  • 日本語
  • 한국어
  • Deutsch
  • Français
  • Italiano
  • Türkçe
  • Tiếng Việt
  • ไทย
  • Polski
  • Nederlands
  • हिन्दी
  • Magyar
translation

これはAIが翻訳した投稿です。

제이온

[エフェクティブ・Java] アイテム 5. リソースを明示的に指定するのではなく、依存オブジェクトの注入を使用する

言語を選択

  • 日本語
  • English
  • 汉语
  • Español
  • Bahasa Indonesia
  • Português
  • Русский
  • 한국어
  • Deutsch
  • Français
  • Italiano
  • Türkçe
  • Tiếng Việt
  • ไทย
  • Polski
  • Nederlands
  • हिन्दी
  • Magyar

durumis AIが要約した文章

  • クラスが内部的に1つ以上のリソースに依存する場合、静的ユーティリティクラスとシングルトンクラスは使用しないことをお勧めし、依存オブジェクトの 注入を使用することが望ましいです。
  • 依存オブジェクトの注入を使用すると、クラスの柔軟性、再利用性、テスト容易性を向上させることができ、リソースをコンストラクター、 静的ファクトリ、ビルダーなどで注入することができます。
  • 依存オブジェクトの注入は、リソースそのもの、またはリソースファクトリを渡す方法で使用できます。依存関係が多いプロジェクトでは、依存オブジェクト フレームワークを使用することが効率的です。

クラスが内部的に1つ以上のリソースに依存し、そのリソースがクラスの動作に影響を与える場合、シングルトンと静的ユーティリティクラスは使用しないことをお勧めします。


これらのリソースをクラスが直接作成することも避け、代わりに必要なリソースをコンストラクターに渡すのが適切です。依存性注入を使用することで、クラスの柔軟性、再利用性、テストのしやすさを向上させることができます。


静的ユーティリティクラスを使用した例

public class SpellChecker {

    private static final Lexicon dictionary = new Lexicon();

    private SpellChecker() {
    }

    public static boolean isValid(String word) {
        // dictionaryを使用したロジック
    }

    public static List suggestions(String typo) {
        // dictionaryを使用したロジック
    }

このユーティリティクラスは、1つの辞書のみを使用することを前提としています。しかし現実には、辞書は言語ごとに別々にあることが多く、特殊な語彙用の辞書を別に用意する場合もあります。


シングルトンを使用した例

public class SpellChecker {

    private final Lexicon dictionary = new Lexicon();

    public static SpellChecker INSTANCE = new SpellChecker();

    private SpellChecker() {
    }

    public static boolean isValid(String word) {
        // dictionaryを使用したロジック
    }

    public static List suggestions(String typo) {
        // dictionaryを使用したロジック
    }


シングルトンも同様に、1つの辞書のみを使用することを前提としているため、上記のような欠点が発生します。


解決策1 - フィールドからfinalキーワードを削除する。

public class SpellChecker {

    private Lexicon dictionary = new Lexicon();

    public static SpellChecker INSTANCE = new SpellChecker();

    private SpellChecker() {
    }

    public static void changeDictionary(Lexicon dictionary) {
        this.dictionary = dictionary;
    }

    public static boolean isValid(String word) {
        // dictionaryを使用したロジック
    }

    public static List suggestions(String typo) {
        // dictionaryを使用したロジック
    }


静的ユーティリティクラスまたはシングルトンクラスのdictionaryについて、finalキーワードを削除し、外部からdictionaryを別の辞書に置き換えるように設計することもできます。しかし、この方法は使用が難しく、マルチスレッド環境では同時性問題が発生する可能性があります。


解決策2 - 依存性注入を使用する。

public class SpellChecker {

    private final Lexicon dictionary;

    public SpellChecker(Lexicon dictionary) {
        this.dictionary = dictionary;
    }

    public static boolean isValid(String word) {
        // dictionaryを使用したロジック
    }

    public static List suggestions(String typo) {
        // dictionaryを使用したロジック
    }


上記の例から、静的クラスとシングルトンは、内部的なリソースに依存してはならないことがわかります。つまり、内部リソースは外部から注入されることが望ましいということです。


依存性注入を使用したクラスは、finalキーワードのおかげで不変性を保証することができ、複数のリソースインスタンスをサポートするという利点があります。 また、依存性注入は、コンストラクターだけでなく、静的ファクトリやビルダーでも適用できます。


依存性注入は、単にリソースそのものを渡す方法もありますが、リソースファクトリを渡す方法もよく使用されます。ファクトリとは、呼び出されるたびに特定のタイプのインスタンスを繰り返し作成するオブジェクトのことです。この方法はファクトリメソッドパターンと呼ばれ、Java 8ではSupplierがファクトリを表す完全な例です。


public static List create(Supplier generator) {
    ...


主に限定ワイルドカードタイプを使用して、ファクトリのタイプパラメーターを制限します。この方法を使用すると、クライアントは、指定したタイプのサブタイプであれば、どのようなファクトリでも渡すことができます。


依存性注入は、柔軟性とテストのしやすさを向上させますが、依存関係が非常に多いプロジェクトでは、コストがかかる可能性があります。このような場合は、依存性注入フレームワーク(Dagger、Guice、Springなど)を使用することでコストを削減できます。


出典

제이온
제이온
제이온
제이온
[エフェクティブ・Java] アイテム 3. プライベートコンストラクタまたは列挙型でシングルトンであることを保証する Javaでのシングルトンパターンの実装方法3つ(public static メンバー、静的ファクトリメソッド、列挙型)を紹介し、それぞれの方法の長所と短所、シリアライズ時の注意点について説明します。リフレクション攻撃に対する安全性とコードの簡潔さを考慮して、列挙型方式を最も望ましい方法として提示します。(出典:エフェクティブ・Java、 https://catsbi.oopy.io/d7f3a636-b613-453b-91c7-655d71fda2b1)

2024年4月27日

[Effective Java] アイテム 1. 静的ファクトリメソッドをコンストラクタよりも優先する 静的ファクトリメソッドは、コンストラクタの代わりにインスタンスを作成する柔軟で効率的な方法です。 名前を付けることができ、特定の条件に合致するインスタンスを返したり、キャッシュを使ってパフォーマンスを向上させることができます。 シングルトンパターンとは異なり、複数のタイプのインスタンスを作成して返したり、リフレクションを使わずに柔軟性を維持することができます。

2024年4月27日

[Effective Java] アイテム 4. インスタンス化を阻止するには、private コンストラクターを使用する 静的メソッドとフィールドのみを含むユーティリティクラスは、インスタンス化を防ぐために、コンストラクターのアクセス修飾子をprivateに設定するのが最適です。 これにより、ユーザーがコンストラクターが自動生成されたものと誤解するのを防ぎ、継承を不可能にすることで、クラスの意図を明確に示すことができます。

2024年4月28日

Rustが並行性バグを防ぐ方法 Rustは、並行プログラミングの課題を解決する強力な言語です。 型システムと所有権モデルにより、スレッド間のデータの受け渡しと共有が安全になります。 Mutex、Channel、Atomicなどの内部可変性パターンを通じて、共有変数を定義し、安全に使用することができます。 Rustは並行性問題を積極的に解決し、大規模システム開発に広く活用されています。
곽경직
곽경직
곽경직
곽경직
곽경직

2024年3月28日

[python]Python 基礎1 Python モジュールについて Python モジュールは、変数、関数、クラスなどをまとめたファイルで、他の人が作ったモジュールを使用したり、共通的に使用される変数、関数などをまとめて使用する場合に便利です。`import` キーワードを使用してモジュールを呼び出して使用することができますし、直接モジュールを作成して使用することもできます。
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자

2024年3月27日

個人投資家がプライベートエクイティよりも有利な点:現金はできるだけ早く、使い尽くす必要がない プライベートエクイティは、高い収益率を実現するために、ファンド資金を迅速に投資しようとする傾向があり、これは無理な取引につながる可能性があります。特に ブラインドファンドは、投資対象が特定されていないため、迅速な投資がさらに重要になり、IRRを高くするための焦りが問題を引き起こす可能性があります。 個人投資家は、プライベートエクイティとは異なり、パフォーマンス報酬に関するプレッシャーがないため、市場状況に応じて柔軟に現金比率を調整することが 望ましいです。
고집스런가치투자
고집스런가치투자
고집스런가치투자
고집스런가치투자

2024年4月3日

物理データモデリング 物理データモデリングは、リレーショナルデータベースのテーブルを実際に使用できるように設計するプロセスであり、ストレージスペースの効率性、データパーティショニング、インデックス設計などを通じて、パフォーマンスの最適化を目指しています。遅いクエリ分析、インデックスの活用、キャッシュの適用などにより、パフォーマンスの問題を解決できます。必要に応じて、デノーマライズ手法を使用することもできます。
제이의 블로그
제이의 블로그
제이의 블로그
제이의 블로그
제이의 블로그

2024年4月9日

論理的データモデリング 論理的データモデリングは、概念的データモデリングをリレーショナルデータベースパラダイムに合わせて変換するプロセスであり、1:1、1:N、N:Mの関係を処理し、正規化によってデータの整合性を確保します。1NF、2NF、3NFを経てテーブルを精製し、部分従属と推移的従属を削除します。
제이의 블로그
제이의 블로그
제이의 블로그
제이의 블로그
제이의 블로그

2024年4月9日

[非専攻、開発者として生き残る] 14. 新卒開発者がよく聞かれる技術面接内容まとめ 新卒開発者向けの技術面接準備ガイドです。メインメモリ領域、データ構造、RDBMSとNoSQL、手続き型とオブジェクト指向、 オーバーライドとオーバーロード、ページ置換アルゴリズム、プロセスとスレッド、OSI 7層、TCPとUDPなど、面接でよく登場する概念を 説明します。
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자

2024年4月3日