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

时间:2013-10-30 08:55:27

标签: java

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

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

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

4 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

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

答案 2 :(得分:0)

你应该知道非静态方法属于Object,但静态方法属于Class。因此getNonStaticVariables方法和nonStaticVariable应该是静态的,或者将outputToTxt更改为非静态方法。

答案 3 :(得分:0)

在不了解您的特定要求的情况下,我首先想到的是也许您的非静态变量或静态方法属于其他地方。

恕我直言,当一个类持有变量,非静态内容时,提供使用该变量的静态访问器函数可能不是一个好主意。我认为最好的解决方案是将两者分开,赋予将可变数据存储在某些Data Provider类中的责任,该类可以提供此变量的DEFENSIVE COPY。也许您没有看到它的需要,因为您的示例处理的是原始值。但是,如果将其更改为某个对象引用,则可能会遇到各种各样的问题。其中之一是您的代码将不是线程安全的。

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

再次,我认为这是一个更可靠的解决方案。