Java - 这是一个好习惯吗?

时间:2012-11-07 20:01:54

标签: java arraylist

我正在设计一个简单的汽车租赁系统,并想知道我是否在设计中使用了良好的实践。基本上,我有一个陈列室arraylist,存储所有租赁汽车(新物品)。在每个汽车对象内部是一个arraylist为该月的汽车可用性。可用性包含31个值(对应于该月中的每一天),0或1(可用)。它们最初设置为1,直到当天预订车辆。是否有其他方法可以纳入可用性?

ArrayList<Car> showroom = new ArrayList<Car>();

ArrayList<Integer> Available1 = new ArrayList<Integer>();
ArrayList<Integer> Available2 = new ArrayList<Integer>();

setAllDatesAvailable(Available1);
setAllDatesAvailable(Available2);

Car number1 = new Car(objectitems, ... , Available1);
showroom.add(number1);
Car number2 = new Car(objectitems, ... , Available2);
showroom.add(number2);
  

//预订流程

setAllDatesAvailable(ArrayList Array) {
   for (int i = 0; i < 31; i++) {
      Array.add(1);
}

注意:

  • 我不担心时间戳,假设这辆车被预订了 一整天
  • 假设系统仅为一个月的31天

3 个答案:

答案 0 :(得分:3)

将可用性记录为一组布尔值(或整数)会更简单。对于这样的固定长度记录,没有必要使用ArrayListArrayList的主要好处是它可以动态增长)。

我认为最好使用boolean或int的默认值来表示可用性 - 然后你根本不需要显式初始化数组。对于布尔值,这意味着记录预订不可用:

    boolean[] booked = new boolean[31];
    System.out.println(booked[0]);  // false

这也突出了一个潜在的混淆 - 由于零索引,本月的日子常常​​在软件中混淆,因此您需要清楚该月的第一天是0还是1。

在Car对象中存储(并初始化,如果需要)预订/可用性,并且在Car对象上提供方法以根据需要操作该数据,这将更好,更面向对象

答案 1 :(得分:3)

以下是我为您的代码建议的一些改进: -

  1. 首先,关注Java Naming Conventions。变量名称应以小写字母开头。 Available - &gt; available,甚至更好,availableDates以符合List

  2. 的目的
  3. 始终使用通用类型集合。

    setAllDatesAvailable(ArrayList Array)
    

    到:

    setAllDatesAvailable(ArrayList<Integer> array);
    
  4. 使用Interface作为参考类型。您应将列表声明为: -

    List<Integer> availableDates = new ArrayList<Integer>();
    

    方法中的形式参数也是如此,如@Alex的评论所示。

  5. 为变量选择有意义的名称。

    Car number1 = ...; <-- // makes no sense to reader
    

    将其更改为: -

    Car car1 = ...;
    
  6. 尽可能尝试将formal参数命名为与actual参数相同的参数。

    setAllDatesAvailable(ArrayList<Integer> array);
    

    最好声明为: -

    setAllDatesAvailable(List<Integer> availableDates);
    
  7. 在完成所有这些更改之后,您可以期待即兴创建代码的功能,@ DNA在answer中已经很好地编写了。

答案 2 :(得分:0)

下面的东西也许 - 我会避免绕过裸体收藏品。 LocalDate位于joda库中。 Car上的默认范围是故意的,假设它们在同一个包中,但客户端不是:

public class Showroom {

    private Collection<Car> cars = new ArrayList<Car>();

    public boolean isCarAvailable(Car car, LocalDate day) {
        return car.isAvailable(day);
    }

    public void bookCarOnDate(Car car, LocalDate day) throws IlegalStateException {
          car.book(day);
    }

    public Collection<Car> getCars() {
          return Collection.unmodifiableCollection(cars);
    }
}

class Car {

    private Map<LocalDate, Boolean> dayAvailability = new HashMap<LocalDate, Boolean>();

    Car() {
        //add other private attributes
        //don't provide setters for these - create new whenever modified so don't leak 
        //state and thread safety
    }

    boolean isAvailable(LocalDate day) {
       return dayAvailability.get(day) != null && dayAvailability.get(day);
    }

    void book(LocalDate day) {
     if (isAvailable(day)) {
         dayAvailability.put(car, true);
     else {
         throw IllegalStateException("Car "+car+" not available for booking on date "+localDate);
     }
}