下面,我编写了简单的代码,重新创建了随着我的应用程序增长而出现的问题。
问题陈述:
我有一个类需要用于创建多态对象,每个对象都需要可变数量的数组作为输入。因此,在我的应用程序运行期间,我可能会实例化其中的两到五个对象。在它们之间,这些对象可能有 15 个数组。更重要的是,其中一些数组需要在创建后从各种不同的其他对象进行修改,而不仅仅是创建或“容纳”它们的对象。
三问:
1.) 将许多不同的数组传递到一个类中的最稳定/推荐的方法是什么?我在下面使用了可变参数方法,但不确定这是否是最好的方法。
2.) 如何避免由于静态关键字引起的问题?您将看到下面 Main.java 中的代码引发了与静态关键字相关的错误。我犹豫是否允许该类的所有实例共享该数组的单个副本。所有这些代码都在 GUI 的内部框架中,我以后可能希望允许用户创建多个内部框架,每个内部框架都有自己的所有这些代码的实例,用于完全不同的数据集。
3.) 在创建数组后,如何使各种其他对象能够编辑和以其他方式操作这些数组?您可以在下面看到我将数组传递给 Another.java,然后在编辑数组之前将这些数组分配给本地类变量。本地数组是否与传递给 Another.java 的对象相同,或者我是否因创建重复数组而出错?
代码示例:
下面的代码示例说明了我需要做什么。
任何人都可以向我展示解决这些问题的以下代码的重写版本吗?
此外,我非常感谢您可以发送到有关如何最好地解决这些问题的文章的任何链接。
主.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);
}}
HandleArrays.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];
}
}
}
EditArrays.java
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?
}
}
最佳答案
这里似乎发生了许多不同的问题,所以我会尝试解决它们。
你实际上并没有使用
varags
- 您正在使用 overloading
.您可以简单地声明,而不是拥有多个变量数量不断增加的方法:void methodName(dataType...variableName) {
// method code here
}
这将为您提供一个输入数据类型的数组(因此,在这种情况下,您最终会得到一个数组数组)。通常,可变参数将在
foreach
中引用。环形。使用它们的唯一条件是必须将它们声明为最后一个参数;同样重要的是要记住,实际上提供它们是完全可选的。static
关键字问题 static
遇到的问题关键字是您试图访问静态(类级)方法中的实例变量。 static
方法只能访问static
变量和变量它们是作为输入参数的一部分提供的。为了绕过“静态错误”,您将不得不传递类的实例(通过 this
引用)或特定数组,或者将数组引用修改为静态:静态引用:
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);
}
}
您似乎对 java 如何处理输入参数有些困惑。
Java 将所有输入参数作为按值传递来处理,有时也称为 pass-a-copy。这在本网站的其他地方有详细介绍,所以我不打算在这里介绍所有内容。
但是,这对您的代码意味着什么:
EditArrays(double[] arrayToEdit) {
thisHereArray = arrayToEdit;
thisHereArray[6] = 4.678;
}
实际上修改了一个数组 - 有三个(或更多)引用。也就是说,
thisHereArray
, 和 arrayToEdit
,以及传入的任何引用(例如,localArray1
中的 Another
)都指向内存中完全相同的数组。此代码产生等效的效果:EditArrays(double[] arrayToEdit) {
thisHereArray = arrayToEdit;
arrayToEdit[6] = 4.678;
}
您所做的只是复制了引用,而不是实际的数组。根据您的要求,这可能是好是坏。在多线程环境中,这将导致大量(几乎无法追踪/可重现)的错误。在单线程环境中,您可能没问题。
在不知道您的确切要求的情况下,很难提供额外的反馈。不过,我可以给出一些一般性建议:
Collections
的成员框架。 variableSameTypeSameName1
格式创建和命名变量, variableSameTypeSameName2
.您要么拥有相同事物的集合(就像您在此处看到的那样)并且它们都应该放入集合(数组)中,或者它们都代表不同的事物并且应该这样命名( peopleToInvite
, peopleToExclude
, peopleToKill
)。 System.out.println()
在“常规”或生产方法中(除非您正在制作控制台应用程序,我对此表示怀疑)。检查时可以进行调试/杂项测试。 an internal frame in the GUI
中运行,尽管您没有提供任何 Swing/AWT 代码。永远不要将任何 UI 代码与“后端”或模型代码直接混合(很难说出你在尝试什么,所以这可能不是问题)——应该避免它引起的头痛。 关于java - 引用持久性并传递可变数量的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8174330/