【问题标题】:Using the same ArrayList over different classes在不同的类上使用相同的 ArrayList
【发布时间】:2015-05-09 19:57:24
【问题描述】:

我对此很陌生,主要是自学,所以任何建议都会对我有所帮助。我对此有过尝试,现在看来我要绕圈子了……

所以我使用 netbeans GUI builder 制作了一个 GUI...我有一个主菜单,我希望能够从任何框架修改一个数组列表...

我有一个员工对象,我想将它放入一个可以从任何类文件访问的 ArrayList 中。我在这个网站上四处寻找一些帮助,但最终被困在试图弄清楚如何将它应用到我自己的网站上。

public class EmployeesDATA {
private ArrayList<Employee> EmployeesDATA;
Main m; //not so sure what this is meant to do 

public EmployeesDATA(Main m) {

    EmployeesDATA = new ArrayList<>();
    this.m = m; 
 }

 public ArrayList<Employee> getList() {
   return EmployeesDATA;
 }

 public void addEmployee(Employee e){
    EmployeesDATA.add(e);
 }
 }

这是我开始真正感到困惑的地方......最终让这门课试图模仿别人的建议哈哈。

public class Main {
     public static EmployeesDATA Employees;

public Main() {
//test employee    
Employee TestObject = new Employee("Jeff","b",1);

//make a new list using this class file only.
Employees = new EmployeesDATA(this);

//add a employee to the list.
Employees.addEmployee(TestObject);
}//end method

public void addEmployeeMainList(Employee e) {
    Employees.addEmployee(e);
    System.out.println("added employee.");
 }

我想我想要的是一个 ArrayList,它只创建一次,然后在其他地方调用。我早期的尝试是创建新的 ArrayList 并丢失旧数据。

接下来是我的 MainMenu 类,它是创建 GUI 的地方。主要方法在这里,但我没有触及它,因为它已经有很多其他生成的东西:

public class MainMenu extends javax.swing.JFrame {  

private EmployeesDATA Employees; 

public MainMenu() {
    initComponents(); //generated

System.out.println(Main.Employees.getList().get(0).employeeFirstName + "test 1"); // I seem to crash out here...
//pretty confused, I can call the Main class but I can't get the Employees.addEmployeeMainList method which is where I wanted to try to keep it protected... Any help there?

 //eventually I will move on to assigning stuff to my GUI items like this:
 //Populate Combo Box with Employees.
    for(int x = 0; x < Employees.size(); x++){
    SelectEmployeeComboBox.addItem(Employees.get(x).employeeFirstName);
    }}

此时我真的只是让自己感到困惑,我很确定有一种更简单的方法可以做到这一点。 任何指针,即使它不能解决手头的问题,也值得赞赏。在这里学习:)。

【问题讨论】:

  • 您可以尝试使用接口来减少耦合。以mediator pattern 为例。
  • 代码太多,读起来很烦,想一想读者,清楚地阐明你的观点
  • 当然我会减少它... 1分钟...
  • 很难理解你在这里想要完成什么。另外,我建议您使用 Java 约定以小写开头的变量名,这样可以立即将其与类区分开来。
  • Jyr - 看看背景,我现在明白了好处。可能会在不同的项目上尝试它并学习如何做到这一点。

标签: java class arraylist


【解决方案1】:

放弃 Main 类 - 这完全没有意义,试试这个

public class MainMenu extends javax.swing.JFrame {  

private EmployeesDATA employees = new EmployeesDATA(); 

public MainMenu() {
    initComponents(); //generated

    Employee testObject = new Employee("Jeff","b",1);
    employees.addEmployee(testObject);
    System.out.println(employees.getList().get(0).employeeFirstName + "test 1"); 

    for(int x = 0; x < Employees.size(); x++){
    SelectEmployeeComboBox.addItem(Employees.get(x).employeeFirstName);
}}

【讨论】:

  • 您必须深入研究EmployeesDATA 类的实现以及所有这些点才能获得一名员工;我会将.get(int) 包装在一个方法中,这样您就不必进入内部列表。
  • 我对这个很感兴趣,它的工作原理与您在主菜单类中所写的一样。如果我想在不同的 GUI 框架中使用它,那么我必须在数组列表、方法和 Test Employee 对象前敲击“静态”……这是不好的约定吗?它至少有效。
  • 这是不好的约定,将数据粘贴到 GUI 组件中是不好的设计。
  • @DavidSoroko 好的。然后完成大修,同时考虑其他人所说的话。我已经把所有的东西都从 GUI 文件中移走了,做了很多方法来处理所有的点......似乎正在取得进展,我现在更快乐了。我宁愿退后一步,重做正确的事情,也不愿以错误的方式学习......接受这个答案。
【解决方案2】:

不确定你想做什么,但如果你想将所有数据保存在一个列表中,并且能够从任何地方这样做并控制可以做什么

 class Data{
    private data(){};

        private static final ArrayList<Employee> elist =new ArrayList<Employee>();

        public static void add(Employee e){
          elist.add(e)
         }
      //search..
      //get a copy of list..
     //watever..
    }

您可以从任何地方调用 Data.add(e)

【讨论】:

  • 您能解释一下原因吗?这会以任何方式违反封装吗?
  • 可变的全局状态使得很难弄清楚程序是如何工作的。很难在代码中找到修改列表的位置,因为它可以在任何地方使用。本质上,它鼓励高度耦合的意大利面条式代码。另一种方法是将列表传递给需要它的对象。什么取决于什么以及正在修改列表的内容会立即变得清晰。
  • 列表是私有静态final ...。列表不能从其他任何地方修改,只能从​​此类的方法中修改。
  • 使用类方法可以在任何地方修改列表。
  • 这种结构修改发生在这个类中,而不是分散在任何地方。如果这个类不是公共的,它将无法从任何地方访问,但是是的,你的意思是......谢谢
猜你喜欢
  • 2016-12-23
  • 2015-02-02
  • 2013-07-16
  • 1970-01-01
  • 2017-02-13
  • 2012-05-28
  • 1970-01-01
  • 2016-08-25
  • 1970-01-01
相关资源
最近更新 更多