-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

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

于 2013-10-30T08:58:46.230 回答
0

我的第一个想法是,您的非静态变量或静态方法可能属于其他地方。

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

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 回答