Java 引用持久性和传递可变数量的数组

Java 引用持久性和传递可变数量的数组,java,arrays,static,polymorphism,variadic-functions,Java,Arrays,Static,Polymorphism,Variadic Functions,下面,我编写了一些简单的代码,这些代码重新创建了随着我的应用程序不断增长而出现的问题 问题陈述: 我有一个类需要用来创建多态对象,每个对象都需要可变数量的数组作为输入。因此,在我的应用程序运行期间,我可能会实例化其中的两到五个对象。在它们之间,这些对象可能有15个数组。更重要的是,这些数组中的一些需要在创建后从各种不同的其他对象进行修改,而不仅仅是通过创建或“容纳”它们的对象进行修改 三个问题: 1。)将多个不同数组传递到一个类中最稳定/推荐的方法是什么?我在下面使用了varargs方法,但不确

下面,我编写了一些简单的代码,这些代码重新创建了随着我的应用程序不断增长而出现的问题

问题陈述:
我有一个类需要用来创建多态对象,每个对象都需要可变数量的数组作为输入。因此,在我的应用程序运行期间,我可能会实例化其中的两到五个对象。在它们之间,这些对象可能有15个数组。更重要的是,这些数组中的一些需要在创建后从各种不同的其他对象进行修改,而不仅仅是通过创建或“容纳”它们的对象进行修改

三个问题:
1。)将多个不同数组传递到一个类中最稳定/推荐的方法是什么?我在下面使用了varargs方法,但不确定这是否是最好的方法。
2。)如何避免由于静态关键字导致的问题?您将看到下面Main.java中的代码抛出与静态关键字相关的错误。我犹豫是否允许该类的所有实例共享该数组的单个副本。所有这些代码都在GUI的一个内部框架中,稍后我可能希望允许用户创建多个内部框架,每个框架都有自己的代码实例,用于完全不同的数据集。
3。)创建阵列后,如何使各种其他对象能够编辑和操纵这些阵列?您可以在下面看到,我正在将数组传递给另一个.java,它在编辑数组之前将这些数组分配给本地类变量。本地数组是传递到另一个.java中的同一个对象,还是我通过创建重复数组而出错

代码示例:
下面的代码示例说明了我需要做什么

有人能给我看一下下面修复这些问题的代码的重新编写版本吗

此外,我非常感谢您能发送任何关于如何最好地解决这些问题的文章的链接

Main.java

public class Main {
int arrayLength = 10;
double[] array1 = new double[arrayLength];
double[] array2 = new double[arrayLength];
double[] array3 = new double[arrayLength];
double[] array4 = new double[arrayLength];
double[] array5 = new double[arrayLength];

static void makeHandleArrays(){// how do I avoid static errors thrown here?
    HandleArrays firstHandleArrays = new HandleArrays();
    firstHandleArrays.arrayLength(array1);

    HandleArrays secondHandleArrays = new HandleArrays();
    secondHandleArrays.arrayLength(array1,array2,array3); //varargs approach
}

public static void main(String[] args){//how do I avoid static errors thrown here?
    makeHandleArrays();
    Another myOtherClass = new Another(array1,array2);
}}
handlearray.java

public class HandleArrays {//Is this varargs approach the best way to handle a variable number of arrays as inputs?
double[][] dataArrays;
int numArrays;
void arrayLength(double[] ...ds){
    dataArrays = new double[ds.length][];
    numArrays = ds.length;
    for(int i = 0;i<ds.length;i++){
        dataArrays[i]=ds[i];
    }
}
}  
public class EditArrays {
      double[] thisHereArray=new double[10];
EditArrays(double[] arrayToEdit){  
                thisHereArray=arrayToEdit;
    thisHereArray[6]=4.678;//does this edit the same object that was passed into the class?  Or did I make an error with the name change?  
}
}
另一个.java

public class Another {
double[] localArray1;
double[] localArray2;

Another(double[] anArray){
    localArray1=anArray;
    EditArrays myEditArrays = new EditArrays(localArray1);// does the name change mean that this line is NOT editing the same anArray?
}
Another(double[] anArray, double[] anotherArray){
    localArray1=anArray;
    localArray2=anotherArray;
    EditArrays myEditArrays = new EditArrays(localArray1);// does the name change mean that this line is NOT editing the same anArray?
    EditArrays anotherEditArrays = new EditArrays(localArray2);// does the name change mean that this line is NOT editing the same anotherArray?
}
}  

这里似乎有许多不同的担忧,所以我将尝试解决它们

  • 1) “瓦拉格”方法
实际上,您没有使用
varags
——您使用的是
重载
。您可以简单地声明以下内容,而不是使用多个变量数量不断增加的方法:

void methodName(dataType...variableName) {
    // method code here
}
这将为您提供一个输入数据类型的数组(因此,在本例中,您将得到一个数组数组)。通常,VARAG将在
foreach
循环中引用。使用它们的唯一条件是必须将它们声明为最后一个参数;同样重要的是要记住,实际上提供它们是完全可选的

  • 2)
    静态
    关键字问题
使用
static
关键字所面临的问题是,您试图在静态(类级别)方法中访问实例变量
static
方法只能访问
static
变量以及作为输入参数的一部分提供的变量。为了避开“静态错误”,您必须传入类的实例(通过
引用)或特定数组,或者将数组引用修改为静态:

静态引用:

public class Main {
    static double[] arr = new double[10];

    public static void main(String...args) {
        arr[0] = 5;
    }
}
传入实例引用:

public class Main {
    double[] arr = new double[10];

    static void modifyArray(double[] modArr) {
        modArr[0] = 3;
    }

    public static void main(String...args) {
        Main inst = new Main();
        modifyArray(inst.arr);
    }
}
  • 3) 从外部编辑阵列
您似乎对java如何处理输入参数有些困惑。
Java将所有输入参数作为pass-by-value处理,有时称为pass-a-copy。本网站其他地方对此进行了详细介绍,因此我不打算在这里一一介绍。
但是,这对您的代码意味着:

EditArrays(double[] arrayToEdit) {
    thisHereArray = arrayToEdit;
    thisHereArray[6] = 4.678;
}
实际上修改一个数组,其中有三个(或更多)引用。也就是说,
这个数组
,和
数组编辑
,以及传入的任何引用(例如,
另一个
)都指向内存中完全相同的数组。此代码产生等效效果:

EditArrays(double[] arrayToEdit) {
    thisHereArray = arrayToEdit;
    arrayToEdit[6] = 4.678;
}
您所做的只是复制引用,而不是实际数组。根据您的要求,这可能是好的,也可能是坏的。在多线程环境中,这将导致大量(几乎无法跟踪/复制)错误。在单线程环境中,您可能很好

  • 提供更多反馈
如果不知道您的确切要求,就很难提供额外的反馈。不过,我可以提出一些一般性建议:

  • 仅对确定或永久大小绑定的集合使用数组。否则,请使用
    集合
    框架的成员
  • 不要以
    variableSameTypeSameName1
    variableSameTypeSameName2
    的格式创建和命名变量。您或者拥有一个相同事物的集合(就像您在这里看到的那样),它们都应该放在一个集合(数组)中,或者它们都代表不同的事物,并且应该这样命名(
    peopleToInvite
    peopleToExclude
    peopleToKill
  • 不要在构造函数内部执行外部(作为参数传递)对象的编辑。您可以将引用传递给要编辑的对象,然后调用方法对其进行编辑
  • 不要在“常规”或生产方法中使用
    System.out.println()
    (除非您正在制作控制台应用程序,我对此表示怀疑)。当你检查东西的时候,它可以用于调试/杂项测试
  • 您提到此代码在GUI的内部框架中运行,尽管您没有提供任何Swing/AWT代码。不要将任何UI代码与“后端”或模型代码直接混合(很难判断您正在尝试什么,s