【问题标题】:how to implement static list of objects in java [closed]如何在java中实现对象的静态列表[关闭]
【发布时间】:2014-09-26 03:04:42
【问题描述】:

只想问一下我在下面创建的类是否正确,或者是否由于使用了静态对象列表而出现问题,以及我的封装实现是否正确,因为我需要限制对我的静态变量的访问。

public class Car {
    private String carName, carPlateNumber;
    private static List<Car> carList;

    public Car(String carName, String carPlateNumber) {
        super();
        this.carName = carName;
        this.carPlateNumber = carPlateNumber;
    }

    public String getCarName() {
        return carName;
    }

    public void setCarName(String carName) {
        this.carName = carName;
    }

    public String getCarPlateNumber() {
        return carPlateNumber;
    }

    public void setCarPlateNumber(String carPlateNumber) {
        this.carPlateNumber = carPlateNumber;
    }

    public static void createCarList() {
        carList = new ArrayList<Car>();
    }

    public static void addCarToList(Car car) {
        carList.add(car);
    }

    public static Car getCarAt(int location) {
        return carList.get(location);
    }

    public static void clearCarList() {
        carList.clear();
    }

    public static List<Car> getCarList() {
         return carList;
    }
}

然后像这样使用这个类

Car.createCarList();
Car.addCarToList(new Car("Mustang","CA-12343"));
. . .
. . .

等等……

【问题讨论】:

  • 为什么在Car?感觉很奇怪,您正在使用的 bean 有自己和其他实例的缓存。
  • 为什么不改用enum
  • 你能给我另一个例子来正确实现它吗?因为我很困惑我如何才能拥有一个供其他班级使用的汽车列表实例。
  • 您必须将 bean 字段和缓存分开,bean 必须由其元素 Car(platnumber 、 model 、 name 等)组成,汽车列表应该/以某种方式必须是主要的。另外,如果您使用的是静态字段,则无需封装它(getter/setter),您应该直接访问它,
  • @agbinfo 您能否详细说明“为什么不改用enum?”的意思?您如何以及为什么要使用enum

标签: java list


【解决方案1】:

类似以下示例的内容可用于共享您的列表。

使用enum 的优点是它提供了延迟初始化;除非您需要,否则不会创建实例。此外,当它被初始化时,它是以线程安全的方式完成的。您可以使用类获得相同的结果,但是您需要以其他方式同步初始化以使列表线程安全。

还有其他方法可以传递列表,但是当列表是全局的时,我认为这种单例模式是一种简单且安全的方法。

main 方法中创建列表会使在另一个程序中重复使用该列表变得更加困难。例如,如果您有多个列表,那么您需要在 main 方法中创建所有列表,然后将它们作为参数传递给每个调用或。如果您有其他类,请参考Main 类来访问列表,如其他地方所建议的那样,那么您将创建循环依赖项。应用程序不需要知道如何创建其库所需的列表,并且这些库不需要了解应用程序。

public enum Cars {
  theCars;

  /* Class can be defined in a different file or defined here. 
     For example:
  public static class Car {
    public String name;
    public String make;
  }

  */

  private List<Car> cars;
  Cars() {
    cars = new ArrayList<Car>();
    cars.add(...)
  }

  // ... functions to deal with Cars
  // or simply return the entire list
  public List<Car> getList() {
    return cars;
  }
}

然后您可以通过参考Cars.theCars.getList()获得汽车

【讨论】:

  • 请注意,枚举类型的构造函数必须是包私有或私有访问。它会自动创建在枚举体开头定义的常量。您不能自己调用​​枚举构造函数。你也不能引用初始化器中的枚举!!!!!!所以在这种情况下cars.add(...) 是错误的。另外请修正您的命名,emum 称为Cars,您正在创建Cars 的列表。我假设这是一个错误,否则它根本没有任何意义。
  • @Arsham 你试过上面的代码吗?它工作正常。 Cars 是一个枚举。 Cars.theCarsCars 的一个实例——唯一定义的一个。 Car 类是普通类,这里没有定义。第一次引用 theCars 时,它会被初始化(延迟初始化),因此一旦被引用,就会调用构造函数,您可以使用 Cars.theCars.getList() 添加、删除或以其他方式访问 List&lt;Car&gt;
  • @agbinfo 这样做有什么好处?也就是说,你到底为什么要这样做?这违背了Enum 的目的,即:“枚举类型是一种特殊的数据类型,它使变量能够成为一组预定义的常量。”如果你有一个类,你可以创建 any 对象,只要你提供给构造函数的值是有效的,那么你为什么要使用enum
【解决方案2】:

您的 bean 必须包含以下元素

public class Car{
   String name,platenumber,model, etc......

   //getters and setters

}

出于缓存目的,您可以将其放在主类中。

public class Main{

    public static List<Car> carList;

  public static void main(String[] args){

     //do what you want to do here
  }

}

public class OtherClassAccessCarList{

  public void someMethod(){
    //how to access static field properly
    Main.carList.add(new Car());
  }

}

参考:link1link2

【讨论】:

  • 你所做的和他在他的代码中所做的有什么区别,目标(我假设)是保留所有类型为Car 创建的对象的列表,你为什么要取出静态列表并在可以拥有一个时创建 3 个类。在他的原始实现中,每次构建Car 类型的对象时,他都可以根据需要将其添加到列表中。我可以通过将列表与对象定义分开来了解您的意思,但是如果有人想兑现所有创建的对象,那么他将使用适当的现金。另外,现在每次我需要在列表中添加Car 时,我都需要记住列表的位置。
  • @niczm25 我想说的是您的初始实现很好。我同意他的说法,您不需要作为列表的设置器,并且由于列表是私有的,因此获取器是合适的。当前的也很好,只是现在您将列表公开,以便每个人都可以访问该列表,如果您不介意那很好。如果您的代码库不大,并且您想在 main 中做很多事情并跟踪那里的汽车,那很好。如果您的代码库很大,并且您将从不同的类添加到此列表中,我会将其保留在 Car
  • @niczm25 如果您将列表放入Main,那么您将获得循环依赖。 Main 依赖于它调用的类,而这些类依赖于Main。这意味着没有Main,子类是不可重用的,应该避免。
  • 我认为,您可能得到了反对票,因为问题太简单和/或通过一些研究可以找到对它的回应。不必对您的实现做任何事情。
  • 啊,应该是这样的,下次我会尝试找到正确的关键字以正确搜索。顺便说一句,非常感谢(鞠躬)。
猜你喜欢
  • 2011-11-25
  • 1970-01-01
  • 1970-01-01
  • 2015-08-16
  • 2021-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多