Prosty circular buffera

0

Kolejne z cyklu naiwnych pytań: tym razem chciałbym zapytać, czy poniższa implementacja ma sens. Chodzi mi głownie o deq (ściąganie elementu z bufora) - podaję, że zwraca typ Type, ale jeśli bufor jest pusty - rzucam wyjątek i deq niczego nie zwróci, czy może w jakiś sposób domyślnie zwróci wtedy null?

import java.util.*;

class CircularBuffer <Type> {
	
	int bsize = 10;
	ArrayList al = new ArrayList(bsize);
	
	public void enq (Type o)
	{
		if (al.size() >= 10) throw new Qfull();
		al.add(o);
	}
	
	public Type deq ()
	{
		if (al.isEmpty()) throw new Qempty();
		Type to = (Type)al.get(al.size()-1);
		al.remove(al.size()-1);
		return to;
	}
}
0

Powinno działać tak jak powinno :D Nigdzie nie masz "domyślnego" zwracania nulla.

Nota bene:
Metoda remove zwraca usunięty obiekt, więc metodę deq mógłbyś dzięki temu skrócić o trzy linijki (po prostu dać: return al.remove(...)).

0

Tak zrobiłem, wygląda teraz następująco:

	public Type dequeue ()
	{
		if (al.isEmpty()) throw new Qempty();
		return (Type)al.remove(al.size()-1);
	}

Skrócona o 2 linijki (być może miałeś na myśli jeszcze coś).

Poprzednie pytanie dotyczyło głównie: czy jeśli bufor będzie pusty (wystąpi wyjątek i nie dotrze do return) nie będzie problemu z tym, że zadeklarowałem "deq zwraca wartość typu Type"? Czy jednak w jakiś sposób coś będzie zwrócone (z Twojej odpowiedzi wynika, że nie, nie musi być w tej sytuacji?)

0

Nic nie będzie zwrócone, bo wystąpi wyjątek. Sparametryzuj ArrayList.

0

Po wystąpieniu wyjątku sterowanie od razu leci do najbliższego (w sensie hierarchii) catch'a, więc nawet gdyby metoda coś zwróciła (sytuacja niemożliwa), to i tak ta zwrócona wartość by wyparowała.

Tak jak napisał iooi, użyj generycznej postaci ArrayList<Type>.

0

Dla upewnienia się - macie na myśli sparametryzowanie jak poniżej?

class CircularBuffer <Type> {
	
	int bsize; // max buffer size
	ArrayList<Type> al; // ArrayList object
	
	CircularBuffer () {
		bsize = 100; // default max buffer size
		al = new ArrayList<Type>();
	}
	
	CircularBuffer (int size) {
		bsize = size; // custom max buffer size
		al = new ArrayList<Type>();
	} }
0

Dzięki. Mam jeszcze pytanie co do upartego warninga (?) Eclipse'a o treści:

The serializable class xxx does not declare a static final serialVersionUID field of type long

Występuje przy pustych klasach zdefiniowanych do obsługi wyjątków, jakie to ma znaczenie?

0

Wyguglaj to.

0

Tak zrobiłem, ale nadal nie wiem, czy oprócz tego, że oglądam żarówkę z wykrzyknikiem ma to jakieś istotne konsekwencje dla programu/czegokolwiek.

0

Jeśli nie zamierzasz nic serializować to generalnie nie ma większego znaczenia, ale możesz dodać to pole, żeby uciszyć Eclipse'a. Myślę, że nawet jakiś wizard jest do tego.

0

Zgadza się, wystarczy najechać, poczekać na chmurkę i kliknąć. Dzięki za wyjaśnienie wątpliwości.

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