#java #list #for-loop #arraylist
#java #Список #для цикла #arraylist
Вопрос:
Я создаю систему аукционов, и у меня есть метод просмотра аукционов. Каждый аукцион имеет статус (ОТКРЫТЫЙ или ЗАКРЫТЫЙ), и я хочу, чтобы метод browseAuctions распечатывал только открытые аукционы.
Я пробовал несколько операторов if, и он всегда продолжает распечатывать каждый отдельный аукцион.
Следующий код — это несколько вещей, которые я жестко запрограммировал для тестирования системы
public List<Auction> auctionSystem() throws Exception {
List<Auction> auctions = new LinkedList<Auction>();
auctions.add(new Auction (35.50, 75.50, 40.00, users.get(3), LocalDateTime.now().minusSeconds(60), "Xbox", users.get(1), Status.OPEN));
auctions.add(new Auction (27.00, 42.00, 32.00, users.get(2), LocalDateTime.now().plusSeconds(10), "PS3", users.get(1), Status.OPEN));
auctions.add(new Auction (19.00, 21.00, 50.00, users.get(2), LocalDateTime.now().minusSeconds(1), "iPhone", users.get(1), Status.CLOSED));
return auctions;
}
Это конструктор класса Auction:
public Auction (double startPrice, double reservePrice, double currentBid, User highestBidder, LocalDateTime closeDate, String item, User seller, Status status) throws Exception {
if (closeDate.isBefore(LocalDateTime.now().plusDays(7))) {
this.startPrice = startPrice;
this.reservePrice = reservePrice;
this.closeDate = closeDate;
this.item = item;
this.highestBidder = highestBidder;
this.currentBid = currentBid;
this.seller = seller;
UP = currentBid * 0.20;
LOW = currentBid * 0.10;
} else {
throw new Exception ("CloseDate error: " closeDate.format(formatter));
}
}
Это Status
класс:
public enum Status {
OPEN, CLOSED
}
Это метод внутри Auction
класса для просмотра аукционов:
public void browseAuctions () {
System.out.println("-----All Auctions-----");
for (Auction a : auctions) {
if (a.status.equals(Status.OPEN)){
System.out.println("Item: " a.getItem());
System.out.println("Current Bid: " "£" a.getCurrentBid());
System.out.println("Close Date: " a.getCloseDate());
}
}
}
}
Ответ №1:
В status
конструкторе игнорируется, поэтому все Auction
экземпляры не должны быть квалифицированы в соответствии с условием в цикле. Интересно, все проходит, и единственное объяснение заключается в том, что значение Status.OPEN
установлено по умолчанию, это означает, что у вас есть следующее объявление в коде:
private Status status = Status.OPEN;
Поскольку он отсутствует в конструкторе, ему не присваивается новое переданное значение. Это проблемы с изменяемыми полями, поэтому я предлагаю вам объявить их final
и разрешить значение по умолчанию с помощью вторичного конструктора:
private final Status status;
// the rest
public Auction (double sPrice, double rPrice, double currentBid,
User highestBidder, LocalDateTime closeDate, String item, User seller)
{
this(sPrice, rPrice, currentBid, highestBidder, closeDate, item, seller, Status.OPEN)
}
В любом случае, чтобы устранить вашу проблему, заполните конструктор:
this.status = status;