我在一个名为 Catalogue
的类中有两个 ArrayLists
, moviesAvailable
和 moviesRented
,我在一个名为 Customer
的类中有另一个称为 currentlyRented
的 ArrayList
。我希望moviesRented
和currentlyRented
关联,以便一部Customer
可以租用许多电影。
我有代码,以便当客户出租电影时,该电影将从moviesAvailable
类中删除,并在moviesRented
类中添加。我希望每个客户都有一个currentlyRented
列表。
Catalogue
类:
private Kiosk kiosk;
private List<Movie> moviesAvailable = new ArrayList<>();
private List<Movie> moviesRented = new ArrayList<>();
private List<Genre> genres = new ArrayList<>();
public void rentMovie(int id, String title) {
Movie mov = movie(title);
if(mov.hasType(title))
moviesRented.add(mov);
moviesAvailable.removeIf(movie -> movie.hasType(title));
System.out.println("Movie rented.n");
}
public Movie movie(String title) {
for(Movie movie : moviesAvailable)
if(movie.hasType(title))
return movie;
return null;
}
public void returnMovie(int id, String title) {
Movie mov = movie(title);
moviesRented.removeIf(movie -> movie.hasType(title));
moviesAvailable.add(mov);
System.out.println(title + " has been returned.");
}
Customer
类:
private int ID;
private String name;
private int balance;
private List<Movie> currentlyRented = new ArrayList<>();
private List<Movie> rentingHistory = new ArrayList<>();
public Customer(int ID, String name, int balance) {
this.ID = ID;
this.name = name;
this.balance = balance;
}
public boolean hasType(int id) {
return id == (this.ID);
}
public void movie(int id, String title) {
Movie movie = movie(title);
currentlyRented.add(movie);
rentingHistory.add(movie);
}
public void returnMovie(int id, String title) {
Movie mov = movie(title);
if(mov.hasType(title))
currentlyRented.removeIf(movie -> movie.hasType(title));
}
public Movie movie(String title) {
for(Movie movie : currentlyRented)
if(movie.hasType(title))
return movie;
return null;
}
public void rents() {
System.out.println(name + " has the following movies: " );
System.out.println("Movies currently rented by " + name + ":");
}
当我运行完整程序时,会发生什么是如果我输入客户id
和电影的title
,则会租用电影。当我使用其他id
租用另一个租金时,它再次租用。但是,当我输入客户id
返回电影时,它列出了两个客户的电影。
您正在复制在Customer
和Catalog
中租用/返回电影的行为。选择一个,然后从那里管理所有列表内容。这是Customer
执行操作的示例实现:
class Movie {
String title;
public Movie(String title) {
this.title = title;
}
// equals, hashCode, toString
}
class Catalog {
public static final List<Movie> moviesAvailable = new ArrayList<>();
public static final List<Movie> moviesRented = new ArrayList<>();
}
class Customer {
private List<Movie> currentlyRented = new ArrayList<>();
private List<Movie> rentingHistory = new ArrayList<>();
public void rentMovie(String title) {
Movie movie = new Movie(title);
if (Catalog.moviesAvailable.remove(movie)) {
Catalog.moviesRented.add(movie);
currentlyRented.add(movie);
System.out.println("Movie " + movie + " was rented to " + this);
} else {
System.out.println("Movie " + movie + " is not available");
}
}
public void returnMovie(String title) {
Movie movie = new Movie(title);
if (currentlyRented.remove(movie)) {
rentingHistory.add(movie);
Catalog.moviesRented.remove(movie);
Catalog.moviesAvailable.add(movie);
System.out.println("Movie " + movie + " was returned by " + this);
} else {
System.out.println("Movie " + movie + " is not being rented by " + this);
}
}
}
由于只有一个Catalog
,要么使其成为单例,要么使用上述静态成员方法(这更简单(。如果您小心,所有列表都将正确同步。但是,这种方法允许目录列表在客户方法之外进行修改。然后,即使currentlyRented
包含电影,Catalog.moviesRented
也可能不会。还有其他可以消除此问题的设计,但这是这个问题的范围。
我认为参加租赁课程也将是更好的设计,它将容纳电影和客户(如果每部电影都可以租用多个以上,则是客户列表顾客(。然后,您的目录课可以为所有客户提供租金列表,以及电影列表(所有租金(。这样,您可以迭代目录类的所有租金,并仅返回适用于特定客户ID等的租金。