如何使用构造函数对Java静态数组进行初始化?

4
我有以下类,下面列出了数组的静态字段。 请问/解释如何创建构造函数来初始化所有数组并将其传递给public static void BookInfo方法。非常感谢您的帮助!
  public class BookInfo {

    // Global arrays accessible by all methods
public static String[] isbnInfo = {

        "978-0060014018",
        "978-0449221431",
        "978-0545132060",
        "978-0312474881",
        "978-0547745527"

      };


public static String[] bookTitleInfo = {

            "The Greatest Stories",
            "The Novel",
            "Smile",
            "The Bedford Introduction to Drama",
            "AWOL on the Appalachian Trail"

           };

public static String[] authorInfo = {

         "Rick Beyer",
         "James A. Michener",
         "Raina Telgemeier",
         "Lee A. Jacobus",
         "David Miller"

        };

public static String[] publisherInfo = {

            "HerperResource",
            "Fawcett",
            "Graphix",
            "Bedford St. Martins",
            "Mariner Books"

            };

public static String[] dateAddedInfo = {

            "05/18/2003", 
            "07/07/1992", 
            "02/01/2010", 
            "09/05/2008", 
            "11/01/2011"

            };

public static int[] qtyOnHandInfo = {7, 5, 10, 2, 8};

public static double[] wholesaleInfo = {12.91, 7.99, 6.09, 54.99, 10.17};

public static double[] retailInfo = {18.99, 3.84, 4.90, 88.30, 14.95};

public static void BookInfo() {

    System.out.println("             Serendipity Booksellers");
    System.out.println("                Book Information\n");       


    for(int i = 0; i < isbnInfo.length; i++){

        System.out.println("ISBN: " + isbnInfo[i]);
        System.out.println("Title: " + bookTitleInfo[i]);
        System.out.println("Author: " + authorInfo[i]);
        System.out.println("Publisher: " + publisherInfo[i]);
        System.out.println("Date Added: " + dateAddedInfo[i]);
        System.out.println("Quantity-On-Hand: " + qtyOnHandInfo[i]);
        System.out.println("Wholesale Cost: $ " + wholesaleInfo[i]);
        System.out.println("Retail Price: $ " + retailInfo[i]);
        System.out.println();

         }
            }
    }

3
你不应该在构造函数中初始化它们。如果你这样做了,每当你通过该构造函数创建一个实例时,那些静态数组就会再次被“初始化”。所以请考虑一下,这是否符合你的意愿? - Kent
3个回答

7
您需要做的是使用一个 static 块。static 数据在任何其他代码运行之前被初始化。当实例化对象时,构造函数仅被调用一次,并且每次实例化该类型的对象时都会被调用,而 static 只在应用程序运行时初始化一次。
public static final String[] ISBN_INFO; 

static 
{ 

    BookInfo.ISBN_INFO = {
    "978-0060014018",
    "978-0449221431",
    "978-0545132060",
    "978-0312474881",
    "978-0547745527" }; 

  // do the same thing with the other blocks

}

将您的static变量也设置为final是一个好主意。


如何从public static void BookInfo方法以及其他类中进行访问? - Vladimir

2

静态变量在类加载时就会加载到内存中,同时它们也将被初始化。你不需要在构造函数中初始化它们。

但是,你可以使用静态初始化块对它们进行初始化。

private static int[] arr;
static {
    // initialize your arrays here in static initializer block.
     arr = new int[5];
     arr[0] = 5; arr[1] = 10; ... so on
}

静态初始化块在类加载时只会执行一次。它负责初始化类的静态变量。

此外,静态变量在所有实例之间共享。因此,通过一个实例对它们进行的任何更改都将反映在所有实例中。因此,在构造函数中初始化它们是没有意义的。


2

在声明或静态块中初始化数组是可能的,不需要使用构造函数。例如:

private static String[] array = {"a", "b", "c"};

或者像这样:
private static String[] array;
static {
    array = new String[] {"a", "b", "c"};
}

实际上,在构造函数中初始化静态成员可能是一个错误,每次通过调用构造函数创建新实例时都不应更改静态成员。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接