-1

そのため、非常に大きな Java コードを書いています。このコード内で、特定のファイル形式でファイルを出力したいと考えています。この例では、単純な .txt ファイルになります。

私が出力しているデータは一連の座標です。これらの座標は、このコード セクションの前にユーザーが決定した角度を使用して回転しています。

ファイルを書き込むコードは明らかに静的メソッドですが、呼び出している角度は非静的変数です...どうすればこれを呼び出して動作させることができますか?

4

4 に答える 4

3

基本的に、非静的変数を含むオブジェクトのインスタンスを静的関数に渡し、そこにアクセスする必要があります。

それは次のようになります。

public class ObjectToBeWritten {
  private int nonStaticVariable;

  public ObjectToBeWritten() {
      // ...
  }

  public int getNonStaticVariable() {
      return nonStaticVariable;
  }

  public static void outputToTxt(ObjectToBeWritten object) {
      nonStaticVariable = object.getNonStaticVariable();
      // ...
  }
}

ObjectToBeWritten.outputToTxt(object)次に、非静的変数を含むオブジェクトを呼び出すだけです。

于 2013-10-30T08:57:47.580 に答える
0

非静的メソッドは Object に属しますが、静的メソッドは Class に属します。したがって、 getNonStaticVariables メソッドと nonStaticVariable を静的にするか、outputToTxt を非静的に変更する必要があります。

于 2013-10-30T09:09:50.330 に答える
0

私の最初の考えは、おそらく非静的変数または静的メソッドのいずれかが別の場所に属しているということです。

クラスが可変の非静的コンテンツを保持する場合、その変数を使用する静的アクセサー関数を提供することはおそらく悪い考えです。最善の解決策は、この 2 つを分離し、この変数の DEFENSIVE COPY を提供できるデータ プロバイダー クラスに可変データを格納する責任を与えることだと思います。あなたの例はプリミティブ値を扱っているため、おそらくその必要性がわからないでしょう。しかし、それを何らかのオブジェクト参照に変更すると、あらゆる種類の問題が発生する可能性があります。その 1 つは、コードがスレッドセーフではないことです。

public class MyDataProvider {
  private Object nonStaticVariable;

  public MyDataProvider () {
    // ...
  }

  public Object getNonStaticVariable() {
    Object copy = new Object();
    // copy the internals from nonStaticVariable to copy
    return copy;
  }
}

次に、ユーティリティクラスはのコピーを使用nonStaticVariableしてその作業を行うことができます...

public class MyUtilityClass {
  public static void outputToTxt(Object nonStaticVariableCopy) {
    // do your work
  }
}

このソリューションは、これらすべての問題を解決し、はるかに堅牢です。

  1. 非静的変数を静的メソッドで使用できるようにします
  2. 元の変数の代わりに非静的変数のコピーを使用しているため、コードはスレッドセーフになります。
  3. 関心の分離: ユーティリティ クラスは変数を格納しません。したがって、ユーティリティ クラスのすべてのメソッドは (Java のMathクラスのように) 静的にすることができ、データ プロバイダーは変数を保持するコンテナーにすることができます。
于 2019-05-21T15:26:26.827 に答える
0

非静的とは、それが何らかのクラス インスタンス (オブジェクト) に属していることを意味します。したがって、このオブジェクトを静的メソッドに渡すか、その中にそれらのオブジェクトを作成してください。

于 2013-10-30T08:58:46.230 に答える