多くのレベルで頻繁に参照されるJavaオブジェクトを作成する場合、そのクラスのインスタンスを使用するか、クラスの静的を作るために良いですか?

CMB:

私はユニットのアーキタイプのマスター・データベースを必要な場所私は私が書いているJavaのゲームを持っています。データベースは、個々のユニットの種類]の統計を含むダースクラスのインスタンスのカップルを保存するHashMapを含むだけのクラスです。場合は、ユニットの名前を使用して、データベースのうちのゲームスポーン新しいユニット、それをコピーユニットは、HashMapの中でそれを見つけます。このデータベースは、ときにプログラムが起動し、一度構築されますと、変更されません。私はまたのHashMapに保存されているクラスのいずれかを拡張したり変更しておりません。ゲームシステムで使用するために、読み取り専用の参照であることを意味しています。

私はユニットの数が含まれているいくつかの他のクラス、基本的に軍隊を持っています。データベースのうち軍がユニットを取得し、それをコピーユニットの情報。私は、マスター・データベースの読み取り方法で軍のクラスを提供する3つの方法があります。これは単純な、奇妙なバグを作成しません読み取り可能なコードを作成するための最善の解決策があるように私はあなたの意見をしたいと思います。

私は(私はセミコロンか何かを逃した場合は申し訳ありませんが、私はすぐに一緒に私の例を入れて、私はまだJavaの勉強)異なるアプローチを説明するためにいくつかの簡単なコードを含めました。

方法1)Iは、クラスインスタンスとしてデータベースを作成し、私は新たな軍隊を作成したり、軍にユニットを追加軍メソッドを呼び出すたびに、私は、軍またはメソッドパラメータとしてデータベース・インスタンスへの参照を渡します。これは、視覚化するのは簡単でなければなりません。

方法2)I、クラスインスタンスとしてデータベースを作成します。軍のクラスでは、私は軍のクラスの静的メソッドで一度設定されますデータベースインスタンスへの静的な参照を持っています。データベースにデータが取り込まれた後、静的メソッドが呼び出されると、データベースへのポイントへの静的参照を設定しています。その後、軍の階級は常に単に静的変数を参照することで、データベースから情報を引き出すことができるようになります。

class database
{
    // HashMap of unit archetypes
    private HashMap<String, Unit> unitLibrary = new HashMap<String, Unit>();

    // method for storing units in HashMap
    void storeUnits(String fileName)
    {
        // load unit stats from file
        // add new Unit instances to unitLibrary
    }

    // getter method
    Unit getUnit(String unitName)
    {
        return unitLibrary.get(unitName);
    }
}

class Army
{
    // variables
    private static Database masterDatabase;
    private static boolean databaseSet = false;
    ArrayList<Unit> armyUnits = new ArrayList<Unit>();

    // method for creating static database reference
    void setReference(Database d)
    {
        // set static reference to main database if not previously set
        if (!databaseSet)
        {
            masterDatabase = d;
            databaseSet = true;
        }
    }

    // add unit to army
    void addUnit(String unitName)
    {
        armyUnits.add(masterDatabase.getUnit(unitName);
    }   
}

public class CodeTest
{
    public static void main(String[] args)
    {
        // create master database
        Database masterDatabase = new Database();
        masterDatabase.storeUnits("FileOfUnits.game");

        // set static reference in army class to point to master database
        Army.setReference(masterDatabase);

        // Create army
        Army army1 = new Army();
        army1.addUnit("Soldier");
    }
}

方法3)私は、静的としてデータベースクラスのHashMapを作成し、データを移入するために静的メソッドを使用します。データベースクラスのgetterメソッドも静的に作られています。データベースからプルする軍クラスのインスタンスニーズたびに、それだけで(Database.getUnitを実行するため、今の言及のない通過)は、すべてではありません。

class database
{
    // HashMap of unit archetypes
    private static HashMap<String, Unit> unitLibrary = new HashMap<String, Unit>();

    // method for storing units in HashMap
    static void storeUnits(String fileName)
    {
        // load unit stats from file
        // add new Unit instances to unitLibrary
    }

    // getter method
    static Unit getUnit(String unitName)
    {
        return unitLibrary.get(unitName);
    }
}

class Army
{
    ArrayList<Unit> armyUnits = new ArrayList<Unit>();

    // add unit to army
    void addUnit(String unitName)
    {
        armyUnits.add(Database.getUnit(unitName);
    }   
}

public class CodeTest
{
    public static void main(String[] args)
    {
        // prepare master database
        Database.storeUnits();

        // create army
        Army army2 = new army2();
        army2.add("Soldier");
    }
}

私はすべての3つの方法を試してみた、と彼らはすべての作業が、コードはまだ始まったばかりであり、私はので、私の初期建築の道トリッキーなバグに遭遇したくありません。私はそれが伝統的なオブジェクト指向の方法でカプセル化されていないことを理解しますが、データベースは、バックグラウンドで作成されると、アクセスする別のメソッド呼び出しの束にパイプしないでいないので、方法3は、実際に私にはきれいなようです。コードも少ないラインと方法2のような無トリックを持っています。

このような何かを持つ任意の提案や経験?私は、Pythonで多くのことをやったが、私はごく最近のJavaを学び始めましたが、まだカプセル化の制限に慣れるしようとしています。

マイケル:

方法1は最高です。

データベースは、バックグラウンドで作成されると、別のメソッド呼び出しの束にパイプしないでいないので、しかし、方法3は、実際にアクセスすることが私にはクリーンです

これは、私には、問題の核心であるように思われます。あなたは、解決しようとしている依存性注入を静的変数とし、それはひどいアイデアです。春のようなフレームワークは、あなたのような特徴を持つチェーンの下のオブジェクトを渡すのトラブル保存することができますオートワイヤリングをあなたはそれが問題だと思います。

どのような場合は、2番目の例では、私は軍を作成し、データベースを設定するのを忘れ?私は半作成状態に効果的だオブジェクトを持っています。オブジェクトは、このようなAの状態になることはありません。あなたはそれがコンストラクタに渡される必要だろうなら、あなたは、この潜在的なバグを避けているだろう。

あなたの要件が変更される可能性がありますか見当がつかないとき、彼らは、単一のインスタンスにあなたを制限することで、メンテナンスの問題は、同様に、2番目と3番目の例であります。どのように二つの異なる軍隊がすることを知って、常にデータベースを共有しますか?どのような将来的にあなたがしたい場合ModernUSArmyAncientMacedonianArmy-あなたは、彼らが同じ原型を共有することを確かに知っているのですか?

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=201776&siteId=1