public interface Printer {
void printFile(File file) throws IOException;
void printAllFiles(File[] files) throws IOException;
}
public class SimplePrinter implements Printer {
public SimplePrinter() { /* ... */ }
@override
void printFile(File file) throws IOException { /* ... */ }
@override
void printAllFiles(File[] files) throws IOException { /* ... */ }
}
public interface Locker {
void lock();
void unlock();
}
public class ThreadSafePrinter extends SimplePrinter {
private Locker locker;
public ThreadSafePrinter(Locker locker) { this.locker = locker; }
@override
void printFile(File file) throws IOException {
locker.lock();
super.printFile(file);
locker.unlock();
}
@override
void printAllFiles(File[] files) throws IOException {
locker.lock();
super.printAllFiles(files);
locker.unlock();
}
}
Klasa SimplePrinter jest prostą implementacją interfejsu drukarki, metoda printFile drukuje zawartość pojedynczego pliku, metoda printAllFiles drukuje zawartość wszystkich plików przekazanych w tablicy. Klasa ta nie jest przystosowana do pracy z wieloma wątkami. Interfejs Locker reprezentuje dowolną blokadę służącą do synchronizacji obiektów. Klasa ThreadSafePrinter jest (w założeniu) implementacją przystosowaną do pracy z wieloma wątkami. W klasie tej celowo nie zastosowano natywnego mechanizmu synchronizacji Javy, użytkownik tej klasy może w argumencie konstruktora podać dowolną implementację interfejsu blokady. Klasa File jest standardowym interfejesem Javy do obsługi plików. Klasa IOException jest standardową klasą wyjątków zgłaszanych m.in. przez metody klasy File.
-
Czy dziedziczenie klasy ThreadSafePrinter z klasy SimplePrinter spełnia zasadę postawiania Liskov? Odpowiedź uzasadnij.
-
Czy szczegóły implementacji metod printFile i printAllFiles w klasie SimplePrinter mogą mieć wpływ na poprawność
przedstawionej klasy ThreadSafePrinter? Odpowiedź uzasadnij. -
Czy klasa ThreadSafePrinter jest odporna na wyjątki? Odpowiedź uzasadnij.
-
Uwzględniając swoje odpowiedzi na pytania 1-3, zaproponuj poprawioną implementację klasy ThreadSafePrinter.
Należy przyjąć również zdroworozsądkowe założenia w kwestii nie jasnej, takie zadanie miałem jakiś czas temu jako drobna część na kolokwium, jestem ciekawy waszych odpowiedzi na pytania, nie umieszczam swoich, żeby nie nasuwać z góry pomysłów.