import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; /** * Kütüphane ödünç sistemi — arayüz (sözleşme) testleri için örnek. * Genel API: * addBook(isbn, title) -> boolean (yeni eklendiyse true) * borrow(isbn, member) -> IllegalStateException (ödünçte), NoSuchElementException (yok) * giveBack(isbn) -> Optional (iade eden üye) * borrowedBy(member) -> List isbn (alfabetik sıralı) * isAvailable(isbn) -> boolean * Bir üye en fazla MAX_LOANS kitap ödünç alabilir. */ public class Library { public static final int MAX_LOANS = 3; private final Map titles = new HashMap<>(); private final Map loans = new HashMap<>(); public boolean addBook(String isbn, String title) { if (isbn == null || isbn.isBlank() || title == null || title.isBlank()) { throw new IllegalArgumentException("isbn and title are required"); } return titles.putIfAbsent(isbn, title) == null; } public void borrow(String isbn, String member) { if (!titles.containsKey(isbn)) { throw new java.util.NoSuchElementException("unknown book: " + isbn); } if (loans.containsKey(isbn)) { throw new IllegalStateException("already borrowed"); } if (borrowedBy(member).size() >= MAX_LOANS) { throw new IllegalStateException("loan limit reached"); } loans.put(isbn, member); } public Optional giveBack(String isbn) { return Optional.ofNullable(loans.remove(isbn)); } public List borrowedBy(String member) { List out = new ArrayList<>(); for (Map.Entry e : loans.entrySet()) { if (e.getValue().equals(member)) { out.add(e.getKey()); } } out.sort(String::compareTo); return out; } public boolean isAvailable(String isbn) { return titles.containsKey(isbn) && !loans.containsKey(isbn); } public int bookCount() { return titles.size(); } }