I have 3 classes:
Event
public class Event<T> {
private List<BiConsumer<Object, T>> consumers = new ArrayList<>();
public void subscribe(BiConsumer<Object, T> consumer) {
consumers.add(consumer);
}
public void invoke(Object sender, T arg) {
for (BiConsumer<Object, T> consumer : consumers) {
System.out.println(sender + " " + "sender");
consumer.accept(sender, arg);
}
}
}
Rat:
public class Rat {
private Game game;
public Rat(Game game) {
this.game = game;
game.ratEnters.subscribe((sender, arg) -> {
System.out.println( this + " " + sender);
});
System.out.println(this + "this");
game.ratEnters.invoke(this, null);
}
}
Game:
public class Game {
public Event ratEnters = new Event();
}
and single test:
public class ObserverPatternTest {
@Test
public void singleRatTest() {
Game game = new Game();
Rat rat = new Rat(game);
Rat rat2 = new Rat(game);
Rat rat3 = new Rat(game);
}
}
The output:
design.patterns.behavioral.patterns.observer.exercises.Rat@4e515669this
design.patterns.behavioral.patterns.observer.exercises.Rat@4e515669 sender
design.patterns.behavioral.patterns.observer.exercises.Rat@4e515669 design.patterns.behavioral.patterns.observer.exercises.Rat@4e515669
design.patterns.behavioral.patterns.observer.exercises.Rat@17d10166this
design.patterns.behavioral.patterns.observer.exercises.Rat@17d10166 sender
design.patterns.behavioral.patterns.observer.exercises.Rat@4e515669 design.patterns.behavioral.patterns.observer.exercises.Rat@17d10166
design.patterns.behavioral.patterns.observer.exercises.Rat@17d10166 sender
design.patterns.behavioral.patterns.observer.exercises.Rat@17d10166 design.patterns.behavioral.patterns.observer.exercises.Rat@17d10166
My question is: how it is possible that this instance is not the same as sender instance?
design.patterns.behavioral.patterns.observer.exercises.Rat@4e515669 design.patterns.behavioral.patterns.observer.exercises.Rat@17d10166