Prosty circular buffera

Odpowiedz Nowy wątek
2011-10-20 23:36
javaStart
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;
    }
}

Pozostało 580 znaków

2011-10-20 23:47
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(...)).


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.

Pozostało 580 znaków

2011-10-21 14:22
javaStart
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?)

Pozostało 580 znaków

2011-10-21 18:27
0

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

Pozostało 580 znaków

2011-10-21 18:38
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>.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.

Pozostało 580 znaków

2011-10-21 20:13
javaStart
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>();
    } }

Pozostało 580 znaków

2011-10-21 20:35
javaStart
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?

Pozostało 580 znaków

2011-10-21 21:00
0

Wyguglaj to.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.

Pozostało 580 znaków

2011-10-21 21:03
javaStart
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.

Pozostało 580 znaków

2011-10-21 21:08
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.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.

Pozostało 580 znaków

2011-10-21 21:10
javaStart
0

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

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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