Usuwanie algorytmu nie mając do niego referencji

0

Hej. Mam obiekt ,któremu podrzucam do wykonania różne algorytmy. Chciałabym aby przy usuwaniu danego algorytmu nie musiała znać jego referencji.
Problem zademonstrowany na przykładzie:

public class Main {
    public static void main(String[] args) {
		Pralka pralka = new Pralka();
		Program wirowanie = new Wirowanie();
		pralka.add(wirowanie);
		pralka.add(new Suszenie());
		pralka.start(new Odziez("Koszulka"));
		pralka.remove(wirowanie);
		pralka.start(new Odziez("Sweter"));
	}
}

I w takim wypadku nie mam możliwości pozbyć się suszenia. Zrobiłam więc tak: http://ideone.com/5jlpS9 . Czy takie rozwiązanie jest do zaakceptowania czy średnio? Może powinnam przeczytać o jakimś użytecznym wzorcu do takich wypadków?

2

Bez sensu. Jeśli już byś bardzo chciała to wrzucaj te programy do mapy Map<String, Program> a nie takie cuda na kiju...
Ale generalnie to ja bym się zastanowił czy nie powinnaś mieć tutaj singletonowych, bezstanowych obiektów wyciąganych z jakiegoś EnumMap. No bo po co chcesz tworzyć wielokrotnie Wirowanie skoro możesz mieć jeden taki obiekt?

1

a może w metodzie usuwania użyjesz instanceof zamiast porównania? wtedy zamiast obiektu do metody remove podasz tylko klasę, i wywalisz z listy wszystkie instancje tej klasy :)

nie próbowałem więc nie wiem czy będzie działało :P

1

Tak najprościej:

// main
int suszenieId = pralka.add(new Suszenie());
...
pralka.remove(suszenieId);

...

// pralka
public int add(Program program) { 
  // jesli List<Program>
  programs.add(program); 
  // jesli Map<Integer, Program>
  programs.put(program.hashCode(), program);

  return program.hashCode();
}

public void remove(int programId) { 
  // znajdz w programs wpis wg programId i skasuj
  // jesli Map<Integer, Program>
  programs.remove(programId);
}

// Suszenie
public int hashCode() { 
    int hash = 1;
    hash = hash * 31 + getClass().getName().hashCode();
    hash = hash * 31 + programName().hashCode();
    return hash;
}

Wada: hashCode nie musi być unikalny, jeśli się powtórzy to mamy problem.
Można w takiej sytuacji użyć zamiast hashCode np. nr kolejnego generowanego w Pralce i obsługiwanego w ten sam sposób.

Zasoby:
http://en.wikipedia.org/wiki/Java_hashCode%28%29
http://www.ibm.com/developerworks/library/j-jtp05273/

0

Dzięki!

2

<quote="1052524">Tak najprościej:

// main
int suszenieId = pralka.add(new Suszenie());
...
pralka.remove(suszenieId);

...

Czym się różni trzymanie referencji od trzymania Id ? Nie dość że niczym się nie różni, to jeszcze trzeba implementować skomplikowany algorytm przechowywania i zarządzania idkami.

0
krgr napisał(a):

Czym się różni trzymanie referencji od trzymania Id ? Nie dość że niczym się nie różni, to jeszcze trzeba implementować skomplikowany algorytm przechowywania i zarządzania idkami.

Po co pytasz skoro już wiesz? (lub nie...)

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