调用单独的 Java class 来设置或更改数据,而无需请求 return 或设置对象

Call a separate Java class to set up or change data without asking for a return or setting up an object

我正在尝试将 java 程序拆分为 .java 个文件,这些文件从主类调用:

public static void main(String[] args) { 
//Call code in a separate .java file which sets up an array of objects.
//Call code to change the object values in a certain way i times
//Call code to do some calculations
//Call code to display some info
}

我遇到的所有指南都大致类似于调用单独的代码来做某事,指的是创建对象(例如MyObject myobject1 = new MyObject(););或获取返回值(例如 x=myMethod(datain);),而不是简单地创建或更改数据。

我是不是遗漏了什么,或者没有办法避免将所有 creating/changing 代码放在同一个主 .java 文件中,而无需人为创建对象或变得毫无意义 returns 这样的作为 Boolean datacreated = createMyData()

在我简单的 Fortran 派生世界中,我可以按如下方式拆分主程序:

call SetUpMyData
call ChangeMyData
call SomeOtherSub
//etc

嗯,有一种方法。如果你想有一个单独的 class 改变你的主 class 中的变量而不使用 return 语句或任何东西,你必须将它们定义为全局变量。你可以通过在你的主要方法之上创建它们来做到这一点,就像这样:

class Main {
    public static int sampleNumber = 0;
    public static String sampleString; 

    public static void main(String[] args) {
        SupportClass.setVariables();
    }
}

然后在您的 SupportClass 中,您想要更改第一个 class 的值,用 Classname.varaiblename:

引用它们
class SupportClass {
    public static void setVariables() {
        Main.sampleNumber = 20;
        Main.sampleString = "This works!";
    }
}

但老实说,这不是一个好方法。如果您不想弄乱您的 main 方法,请在 main class 的底部添加一个辅助方法来设置变量。这不是设置变量的常用方法。

好吧,虽然您可以做一些事情,但您首先应该改变您的想法,使其更加面向对象。在那里你将有一个构造函数来设置一个对象。或者你会在同一个对象上调用多个方法 - 如果它们处理相同的数据。

main(String[] args) {
  World world = new World(); // setup different fields
  world.prepare(); // modify some fields
  world.calculate();
  System.out.println(world.getResult()); // or world.printResult();
}

您可以使用单例或字段隐藏一些数据依赖性,但您不应该这样做,因为这会使程序难以理解。

如果你想将一个更大的计算结构化到子例程中,你可以用私有方法做同样的事情:

class MyExperiment {
  long sum, a, b;

  void doExperiment() {
    init();
    simulate();
    printResults();
  }

  private void init() {
    a = 1;
    b = 1;
  }

  private void simulate() {
    sum = a + b;
 }

 private void printResult() {
   System.out.println("sum=" + sum);
 }
}

您可以从 new MyExperiment().doExperiment()

开始

你当然可以这样写程序。只需制作所有方法并声明 publicstatic。您将能够在程序的任何位置使用它们:

public class Main {
    public static int data[];

    public static void initialize() {
        Main.data = new int[100];
    }

    public static void print() {
        System.out.println(Arrays.toString(Main.data));
    }

    public static void main(String[] args) {
        Main.print();
        Main.initialize();
    }
}

这种方法的问题在于它更容易出错并且更难分析。如果你避免使用全局变量,编译器会发现很多错误:

public static int[] initialize() {
    return new int[100];
}

public static void print(int[] data) {
    System.out.println(Arrays.toString(data));
}

public static void main(String[] args) {
    int data[];
    Main.print(data); // compile error - data is not initialized
    data = Main.initialize(); 
}