调用单独的Java类来设置或更改数据,而不要求返回或设置对象

调用单独的Java类来设置或更改数据,而不要求返回或设置对象,java,class,object,methods,subroutine,Java,Class,Object,Methods,Subroutine,我正在尝试将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

我正在尝试将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=newmyobject();
);或者获取返回值(例如
x=myMethod(datain);
),而不是简单地创建或更改数据

我是否错过了一些东西,或者没有办法避免将所有创建/更改代码放在同一个main.java文件中,而不人工创建对象或获得无意义的返回,例如
Boolean datacreated=createMyData()

在我简单的Fortran衍生世界中,我可以将主程序拆分如下:

call SetUpMyData
call ChangeMyData
call SomeOtherSub
//etc

嗯,有一种方法。如果您想让一个单独的类在不使用返回语句或任何东西的情况下更改主类中的变量,那么必须将它们定义为全局变量。您可以通过在主方法上方创建它们来实现此目的,如下所示:

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

    public static void main(String[] args) {
        SupportClass.setVariables();
    }
}
然后在您的SupportClass中,您要更改第一个类的值,请使用
Classname.varaiblename
引用它们:

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

但老实说,这不是一个好办法。如果不想让主方法变得杂乱无章,可以在设置变量的主类底部添加一个helper方法。这不是设置变量的常用方法

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

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);
 }
}

你可以从新的MyExperiment()开始。doExperiment()你当然可以这样写程序。只需将所有方法和状态
公开
静态
。您可以在程序中的任何位置使用它们:

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(); 
}

Java是面向对象的语言。可以尝试在Java中模拟过程方式,但它不是惯用的Java。此外,伪代码不会显示传递的任何数据结构,只显示对方法的调用。我希望,这并不意味着您的程序将只处理全局数据,而不使用本地数据结构。非常感谢eckes(以及其他响应者),我基本上是在尝试避免在一个地方有数千行代码,但我的重点是使代码更容易出错,并尝试调整我的思维。我想一般的信息是,应该避免/小心地拆分代码。一个简单的问题:在上面的示例中,如果我有存储在数组中的对象(例如r[1],r[2]…等等,其中r[1].x=x1,r[1].y=y1等等),我将如何在MyExperiment类中的长声明之后声明r[],以便例程simulate()可以访问/更改r[1].x,r[1].y等等?我不确定我是否理解这个问题,但是在类中定义字段对该类中的所有方法都是可见的,无论它定义在何处。(当然,方法之外)。(不,拥有大型未拆分代码不是一个好主意:)好吧,我想我应该拆分代码,但除非合适,否则避免将其放在不同的类中。我想我快到了!再次感谢。