現在、Javaでゲームを作成していますが、私はいくつかの簡単な設計上の決定を下して、メモリ使用量を削減します大きな変更は後でメモリ使用量を減らす)。ゲームの主なレイアウトはヘクスグリッドになり、ヘクスを格納するためにHashMap
を使用します。各エントリはPoint
オブジェクトをキーとして持ち、Hex
タイプのオブジェクト(Hex
はインターフェイスです)値として。 Hex
を実装する2つの異なるオブジェクトを作成します。 OceanHex
およびLandHex
。スタティックフィールドのみを含むオブジェクトのメモリ使用
LandHex
には多くのフィールド(建物、統計、現在タイルに載っているプレイヤー)が含まれていますが、プレーヤーは上に建てたり、海のタイルに移動することはできません。本質的に、彼らはただの美意識です。このため、OceanHex
には2つの静的最終メンバーが含まれ、OceanHex
の各インスタンスは同じになります。もともと私は1つのインスタンスOceanHex
をインスタンス化し、それぞれの海洋タイルにそのインスタンスを参照させるだけでメモリ使用量を減らすことを計画しましたが、これは私に不思議を感じました。 OceanHex
には静的フィールドしか含まれていないので、OceanHex
の多くのインスタンスは実際には1つのインスタンスより多くのメモリを使用しますか?
一般的に私の質問は:静的なフィールドだけを含むクラスの場合、オブジェクトのインスタンスが多数あると、オブジェクトのインスタンスが1つ多く存在することになります。
私は静的なフィールドだけを持つクラスのインスタンスを作成することはまれだと思いますが、私は興味があります。
各追加オブジェクトは、* some *メモリを占有しますが、フィールドがインスタンスフィールドであるかのようにはなりません。しかし、静的フィールドを持つ一連のインスタンスを作成するよりも、シングルトンインスタンスを作成する方が正しい方法です。 – shmosel
私のアドバイスは:あなたのデザインをシンプルで正確にナビゲートするようにしてください。そして、しばしば、メモリ使用量がそれ自身を世話するでしょう。そうでない場合は、簡単に書き直すことができます。あなたが恐ろしいデザインから始めると、事態はさらに悪化します。この特定のケースでは、「OceanHex」をシングルトンにすることは、メモリーのフットプリントに関する考慮事項ではなく、あなたの世界ではすべての海洋分野が論理的に同等であるという単純な事実に完全な意味を持ちます。 – biziclop
ちなみに、「OceanHex」の1つのコピーの使用について述べたアプローチは、* Flyweight *のデザインパターンです。特定の具体的なクラスが区別できない場合は、すべての「インスタンス」が意味を持ちます。 – chrylis