如何定义Global Array并在Java中调用不同的类

时间:2014-09-05 14:08:49

标签: java arrays multidimensional-array

我正在使用Java进行分配并拥有2D数组。我创建了多个类,目前我正在每个类中创建数组,并且想知道是否有一种简单的方法在整个程序中只创建一次数组并在不同的类中调用它。 我创建了一个2D数组,我不想使用ARRAYLIST(根据我的知识,当没有固定大小的数组时使用ARRAYLIST但在我的情况下我知道我的ARRAY是5x5)。

以下是我的代码的基本示例:

public class accounts{
        static int option=0;
        static String[][] resultCard =  new String[][]{ 
            { "", "A", "B", "C", "D", "E"},
            { "Account1", "1", "2","3","4","5" }, 
            { "Account2", "6", "7", "8", "9", "10"}, 
            { "Account3", "11", "12", "13", "14", "15"},
            { "Account4", "16", "17", "18", "19", "20"},
            { "Account5", "21", "22", "23", "24", "25"}
        };

public static void method1() {
//I have entered some code here

}

然后我创建了另一个类,如下所示:

 public class customers{
            static int option=0;
            static String[][] resultCard =  new String[][]{ 
                { "", "A", "B", "C", "D", "E"},
                { "Account1", "1", "2","3","4","5" }, 
                { "Account2", "6", "7", "8", "9", "10"}, 
                { "Account3", "11", "12", "13", "14", "15"},
                { "Account4", "16", "17", "18", "19", "20"},
                { "Account5", "21", "22", "23", "24", "25"}
            };

    public static void method2() {
    //I have entered some code here
}

我有另一个课程如下:

public class staff{
            static int option=0;
            static String[][] resultCard =  new String[][]{ 
                { "", "A", "B", "C", "D", "E"},
                { "Account1", "1", "2","3","4","5" }, 
                { "Account2", "6", "7", "8", "9", "10"}, 
                { "Account3", "11", "12", "13", "14", "15"},
                { "Account4", "16", "17", "18", "19", "20"},
                { "Account5", "21", "22", "23", "24", "25"}
            };

    public static void method1() {
    //I have entered some code here
}

public static void method1() {
    //I have entered some code here
}

我想知道,不是在每个类中创建数组,我是否可以仅在01类中创建一个全局数组,并在不同的类中调用该数组。

3 个答案:

答案 0 :(得分:3)

虽然其他答案可以满足您的需求,但您应该从不在可变(可更改)字段上使用public static - 这意味着任何人都可以在应用程序的任何位置更改字段并导致未知的行为。如果添加int double float修饰符,则基元(final)不会改变,但像数组这样的对象可以修改它的内容 - 只有对象引用本身才是常量。结果 - 数组是可变的,所以你不应该使用public static

您的String[][]似乎代表一个表,String[][]中的第一个元素是标题,而另一行是此表中的新行。因此,我们可以将您的String[][]变成更加惯用的内容。

我们可以使String[][]的每一行都由一个类的实例表示。这有一些好处,但它意味着你可以看一下它并说“这是X”,而不是“这是一个字符串数组”。

public class Account {
    private final String name;
    private final String a, b, c, d, e;

    public Account(String name, String a, String b, String c, String d, String e) {
        this.a = a;
        this.b = b;
        this.c = c;
        this.d = d;
        this.e = e;
        this.name = name;
    }

    public string getName() { return this.name; }
    public string getA() { return this.a; }
    public string getB() { return this.b; }
    public string getC() { return this.c; }
    public string getD() { return this.d; }
    public string getE() { return this.e; }
}

封装对象内的字段。这很好,因为这意味着首先,您可以控制字段的分配位置以及可以更改字段的位置。

现在,我们可以将您的String[][]变成Account[]。如上所述,直接共享数组是不好的做法。我们如何解决这个问题?好吧,我们可以创建另一个控制这些帐户生命周期的类。由于它是一个数据存储,我们称之为存储库(注意:这称为存储库模式)。

public class AccountRepository {
    private final Collection<Account> accounts;
    public AccountRepository(Collection<Account> accounts) {
        this.accounts = accounts;
    }

    public Account getByName(String accountName) {
        // Note that this is very inefficient, and I would not recommend using it in real code
        for(Account account : this.accounts) {
            if(account.getName().equalsIgnoreCase(accountName)) {
                return account;
            }
        }
        // Note: Returning null vs throwing exception is out of scope of this example.
        return null;
    }

    public Iterator<Account> getAccounts() {
        return this.accounts.getIterator();
    }
}

现在,这为我们提供了一个数据存储,可以用来存储任意数量的Account和来自任何来源 - 我们不需要担心传递数组,因为我们可以通过这个实例,最好的一点是,我们向感兴趣的各方提供Iterator<Account>而不是Account[]。这很好的原因是因为Iterators是不可变的 - 你无法改变它们。看到这一点,现在,我们可以创建另外两个类(工作人员和客户 - 其名称和目的是在这个问题之外的另一个讨论主题)并告诉他们他们不需要担心String[][] - 他们可以在构造函数中使用AccountRepository的实例。

public class Customers {
    private final AccountRepository accountRepository;
    public Customers(AccountRepository accountRepository) {
        this.accountRepository = accountRepository;
    }

    public void method1() {
        // do something
    }
}

public class Staff {
    private final AccountRepository accountRepository;
    public Staff(AccountRepository accountRepository) {
        this.accountRepository = accountRepository;
    }

    public void method1() {
        // do something
    }
}

这使您的代码 lot 更灵活,更易于维护易于遵循。您的StaffCustomers个实例需要创建AccountRepository,这可能是同一个,并且这些类会调用AccountRepository上的方法来访问数据安全,没有机会改变它。

Account[] accounts = new Account[] {
    new Account("Account1", "1", "2", "3", "4", "5"),
    // the rest of the accounts
};

AccountRepository repository = new AccountRepository(Arrays.asList(accounts));
Customers customers = new Customers(repository);
Staff staff = new Staff(repository);

在我看来,你应该总是尽量避免使用“静态”属性或字段 - 其用法表示大部分时间内代码气味

希望这会有所帮助,不会让您感到困惑。

答案 1 :(得分:1)

您可以拥有一个将静态变量定义为public的公共类。然后在其他课程中,您可以使用className.variableNamestatic import

访问它
public class GlobalVariables {
   public static final String[][] resultCard =  new String[][]{ 
                { "", "A", "B", "C", "D", "E"},
                { "Account1", "1", "2","3","4","5" }, 
                { "Account2", "6", "7", "8", "9", "10"}, 
                { "Account3", "11", "12", "13", "14", "15"},
                { "Account4", "16", "17", "18", "19", "20"},
                { "Account5", "21", "22", "23", "24", "25"}
            };
}

acccounts.java看起来像这样

import static GlobalVariables.*;

public class accounts{

   public void someMethod(){
     resultCard[0]. ....
   }
}

如果变量是常量,您可以将其标记为最终。

答案 2 :(得分:0)

看起来您的数组是常量且不会更改。当我在多个类中使用这样的常量时,我​​创建了一个Defaults.java文件。在这个默认文件中,我可以添加非常明显的应用程序默认值。在你的情况下,它将是这样的:

public class Defaults
{
    public static final String[][] resultCard =  new String[][]{ 
            { "", "A", "B", "C", "D", "E"},
            { "Account1", "1", "2","3","4","5" }, 
            { "Account2", "6", "7", "8", "9", "10"}, 
            { "Account3", "11", "12", "13", "14", "15"},
            { "Account4", "16", "17", "18", "19", "20"},
            { "Account5", "21", "22", "23", "24", "25"}
        };
}

然后您可以在其他类中使用此数组,如下所示:

public class customers
{
    private static int option = 0;

    public static void method2() {
        // I have entered some code here

        // You can use the resultCard like so:
        // Defaults.resultCard
        // As an example: Get the "B" in the array:
        String result = Defaults.resultCard[0][2];
    }
}

如果您不想拥有最终数组,因为您想要从数组中添加,编辑或删除,我建议为此数组创建一个单独的Model类,使用Getter和Setter(也许是Add - ,编辑 - 和/或删除 - 方法)。

此默认值文件中使用的字段不应更改,应为public static final