我可以在构造函数中包含哪些内容?

时间:2011-10-28 17:42:20

标签: java constructor

我正在开发我的第一个Java程序作为一项功课。任务是有一个编目程序来存储和操作某些产品。

我有两个类,一个目录类和一个产品类。产品类存储有关我的产品的数据(ID,价格,颜色)。目录列表包含一系列产品。

我的目录代码是这样的:

public class Catalog() 
    {
     static Product[] productList;

     Catalog () {
     productList = new Product[99];
     }

     populateCatalog {
     // Assign each item product in the product array an ID, Price & Color
     }
 }

productList在整个程序中不会改变,因此将populateCatalog方法中的代码添加到构造函数中是不好的做法吗?

5 个答案:

答案 0 :(得分:5)

你在构造函数中做的很好。另一种选择是在声明它时初始化productList,例如

static Product[] productList = new Product[99];

然而....

你不希望productList是静态的。就目前而言,每个Catalogue实例都没有productList;整个类有一个productList,它在所有实例之间共享(这是static的含义)。每个目录都有自己的产品列表是否正确?因此,将您的声明更改为

private Product[] productList;

这样,Catalog的每个实例都有自己的productList。

答案 1 :(得分:2)

如果你可以在构造函数时初始化每个productList元素,我会说这实际上是最好的做法,而不是暴露一个稍后可以再次调用的方法。在施工时完成并且稍后不更改的对象在其使用中更可靠并且本质上是线程安全的。这个词是“不可改变的”,虽然我不完全确定它适用于这种情况。

答案 2 :(得分:1)

在构造函数中填充Catalog数组并不是任何指南所禁止的。这取决于填充过程是否需要很长时间才能完成。此外,建议在构造函数中填充它,因为这样您始终可以确保在外部代码看到之前正确构造目录对象。如果以单独的方法完成,您的客户端代码可能会在开始使用之前忘记调用它,这可能会导致问题。

答案 3 :(得分:1)

如果productList 必须是静态的,你想这样做:

public class Catalog() {
     public static Product[] productList;

     static {
         productList = new Product[99];
     }
}

答案 4 :(得分:0)

我知道这样做:

public class Catalog {
  static Product[] productList = { //
  //
      new Product(1, "one"), //
      new Product(2, "two"), //
      // ...
      new Product(99, "99th"), //
  };
}

(行注释是为了防止我的IDE的自动格式化程序使其无法读取。)