0

Javaで書かれたシミュレーションを適応させています。私の限られたバックグラウンドはすべて C++ です。

シミュレーションの現在の実装は、 というクラスに依存していParametersます。クラスのインスタンスは のSimulation属性を参照しますがParameters、インスタンス化されることはないと思います。Parametersクラスには次のような構造があります

public class Parameters {
  public static int day = 0;
  public static final int endDay = 365;
  ....
  public static int getDate() {
    return day;
  }
}

のインスタンスにはSimulation、たとえば への参照がありますParameters.day

現在、 のすべての属性Parametersはハードコーディングされています。コマンドライン引数でそれらのいくつかを変更できるようにする必要があります。たとえば、ある種の関数endDayを使用して別の設定ができるようにしたいと考えています。Parameters::setEndDay(int customDay)

私が最初に考えたのは、インスタンス ( Parameters parameters = new Parameters()) を作成し、クラスを完全に書き直して、Parametersそのすべての属性を非公開にし、アクセサー関数を介してのみアクセスできるようにすることでした。このアプローチはあまり効率的ではないことを懸念しています。Parametersこれまでのところ、クラスのインスタンスを作成し、それをSimulation時々参照しながらのインスタンスに渡すというハイブリッド アプローチを試してきましたParameters.day(これは変更する必要はありません)。

問題の 1 つは、私が Java のクラス特権についてよくわかっていないことです。

提案をいただければ幸いです。

4

3 に答える 3

1

静的メンバー変数へのアクセスとオブジェクトのインスタンス化

基本的に、これはグローバル データかローカル データかの選択です。クラス変数 (キーワード static) は、アプリケーション全体に対して 1 つの場所に存在します。たとえば、同じアプリケーションで 2 つのパラメーター化を同時に実行することはできません (ただし、2 つのアプリケーションを並列または順次に実行することはできます)。インスタンス化されたオブジェクトを使用すると、異なる値を含む複数の Parameter オブジェクトを持つことができます。

アクセサー メソッドとアクセス可能なメンバー変数

これについてはいくつかの論争があります。通常、教科書には、オブジェクトの内部状態を保護するためにアクセサ メソッドを使用してすべてのデータをカプセル化する必要があると記載されています。ただし、あなたが述べているように、効率がわずかに低下しており、メンバー変数を直接アクセスできるようにすることが良い方法と見なされる場合があります。

Java アクセス修飾子

Java は、メソッドとメンバー変数に対して 4 つの異なるアクセス修飾子をサポートしています。

  • プライベート。クラス自体からのみアクセスできます。
  • 保護されています。同じパッケージおよび任意のパッケージに存在するサブクラスからアクセスできます。
  • デフォルト(キーワードなし)。同じパッケージのクラスからのみアクセスできます。
  • パブリック。すべてのクラスからアクセスできます。
于 2012-04-21T19:21:02.253 に答える
1

それらをすべて非最終的なものにすると、Simulationクラスをインスタンス化する前に、コマンドライン引数から直接設定できます。

// read command-line arguments

Parameters.endDay = 123; // this will change all reference to Parameters.endDay
new Simulation(...)
于 2012-04-21T19:04:34.883 に答える
1

クラスに静的メソッドsetEndDay(int customDay)を作成しますParameters。また、 object: ではなく class でアクセスせずに値を変更できますParameter.setEndDay(10)endDayvariable は final ではないことに注意してください。

于 2012-04-21T19:06:15.477 に答える