在静态方法 JAVA 中使用非静态变量



所以我正在编写一个非常大的java代码,在这个代码中,我希望它以特定的文件格式输出文件。在这种情况下,它将是一个简单的.txt文件。

我输出的数据是一系列坐标,这些坐标已经使用用户在此代码部分之前确定的角度进行了旋转。

编写文件的代码显然是静态方法,但我调用的角度是非静态变量......我如何调用它并让它工作?

基本上,您必须将包含非静态变量的对象实例传递给静态函数并在那里访问它。

那看起来像这样:

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)

非静态意味着它属于某个类实例(对象)。因此,将此对象传递给静态方法和/或在其中创建这些对象。

你应该知道非静态方法属于对象,但静态方法属于类.因此getNonStaticVariables方法和非静态变量应该是静态的或将输出ToTxt更改为非静态。

我的第一个想法是,也许你的非静态变量或静态方法属于其他地方。

当类包含变量(非静态内容)时,提供使用该变量的静态访问器函数可能是一个坏主意。我认为最好的解决方案是将两者分开,负责将可变数据存储在某个数据提供程序类中,该类可以提供此变量的防御副本。也许您认为没有必要,因为您的示例处理的是基元值。但是,如果要将其更改为某些对象引用,则可能会遇到各种问题;其中之一是您的代码不是线程安全的。

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 类),数据提供程序可以是保存变量的容器。

最新更新