interfejs drukarki, IO

0
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.

  1. Czy dziedziczenie klasy ThreadSafePrinter z klasy SimplePrinter spełnia zasadę postawiania Liskov? Odpowiedź uzasadnij.

  2. Czy szczegóły implementacji metod printFile i printAllFiles w klasie SimplePrinter mogą mieć wpływ na poprawność
    przedstawionej klasy ThreadSafePrinter? Odpowiedź uzasadnij.

  3. Czy klasa ThreadSafePrinter jest odporna na wyjątki? Odpowiedź uzasadnij.

  4. 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.

0

Pierwsze, co mi sie rzuca w oczy - skoro do tego ThreadSafeCośtam jest przekazywana referencja na locker'a, to moze byc tak, ze ktos z zewnatrz np wywola lock() albo unlock() na lockerze, ktory jest uzywany przez te klase ThreadSafeCośtam... czyli nie jest bezpieczna watkowo.

0

Może jakieś jeszcze pomysły?

0

Ofc nie jest odporna na wyjątki i jeśli wywali IOException, to nie dojdzie do odblokowania lockera.

1 użytkowników online, w tym zalogowanych: 0, gości: 1