【问题标题】:How to avoid referencing the same index in an array (Java)?如何避免在数组(Java)中引用相同的索引?
【发布时间】:2012-12-31 01:24:23
【问题描述】:

我的 Java 数组有问题。我在类中使用数组作为类字段,因为我没有实例化类,所以它们都是静态的。我这样称呼一个数组(顺便说一句,这是一个对象数组,'Customer' 是它自己的类):

 public static Customer[] cDatabase = new Customer[MAX_DATABASE];

其中 MAX_DATABASE 是一个常数,表示最大条目数。但是当我输入时会发生什么:

 className.cDatabase[0].firstName = "John";

(为了简单而避免使用方法) 该值已调整,但数组中每个其他单元格中的每个 firstName 字段也会更改。我确信这与我调用数组的方式有关,但是当我这样做时:

 for(int i = 0; i<className.MAX_DATABASE; i++){
      className.cDatabase[i] = new Customer();
 }

这样声明字段后:

 public static Customer[] cDatabase;

然后我得到空指针异常。使该数组正常工作以使元素不指向数组的相同索引的最佳方法是什么? 我敢肯定,正确的答案也可以避免 NPE...

【问题讨论】:

  • 在我看来代码设计存在很大问题。要么你告诉你究竟想要达到什么目标,要么发布SSCCE。并欢迎堆叠。

标签: java arrays initialization element


【解决方案1】:

两者都需要。创建一个新数组并将新对象放入该数组中。

public static Customer[] cDatabase = new Customer[MAX_DATABASE];
for(int i = 0; i<className.MAX_DATABASE; i++){
      className.cDatabase[i] = new Customer();
}

【讨论】:

  • 也可以考虑Arrays.fill(cDatabase, new Customer());
  • @LuigiR.Viggiano 不会在所有数组插槽中放置相同的Customer 吗?
  • 是的,它会的;它可能是正确的或不正确的,具体取决于应用程序的其余部分以及数组的使用方式。
  • 这很有帮助,但另一位用户能够指出实际问题。无论哪种方式,我都没有正确执行此操作,感谢您的帮助!
【解决方案2】:

如果每个单元格的所有firstName 都发生变化,那么事情可能是两个:

  • 您在 Customer 类中将 firstName 声明为 static 并忽略了声明您应该以静态方式访问它的警告
  • 您将相同的 Customer 实例分配给数组的所有元素

例如

Customer[] array = new Customer[MAX];
Customer c = new Customer();
for (int i = 0; i < MAX; ++i)
  array[i] = c;

这里数组的所有元素都指向同一个Customer,因此您始终修改并从每个单元格中获取相同的元素。

你应该做的是:

Customer[] array = new Customer[MAX];
for (int i = 0; i < MAX; ++i)
  array[i] = new Customer();

通过这种方式,您可以创建MAX 的不同实例Customer。修改一个不会影响其他的。

【讨论】:

    【解决方案3】:

    确保您的 firstName 字段本身未在您的 Customer 类中声明为 static,否则它将只包含一个可能的值。

    class Customer {
      private String firstName;
      ...
    
    }
    

    通常也使用公共字段不是好的设计。考虑对这些字段使用 getter 和 setter。这同样适用于 cDatabase 数组字段本身。

    【讨论】:

    • 这似乎是解决方案。然而,由于我的 S&G 是为处理 static 变量而设计的,所以我只需对它们进行一些更改。我还避免在我的示例中使用 S&G 以使其更短。
    猜你喜欢
    • 2012-12-08
    • 1970-01-01
    • 2016-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-05
    • 2018-12-21
    相关资源
    最近更新 更多