Jeg har et problem med et statepattern. Jeg opretter et interface kaldet HeroState og tre klasser kaldet Normal, BadTrip og Speed.
Min Hero klasse indeholder følgende: public final HeroState NORMAL = new Normal(this); public final HeroState SPEED = new Speed(this); public final HeroState BADTRIP = new BadTrip(this); private HeroState state = NORMAL;
Min hero-klasse indeholder en række metoder som mine states skal kunne tilgå. Det kan de tilsyneladende også men de returnerer altid null istedet for det, de skulle have returneret. Dvs. jeg får hele tiden null-pointer fejl! Eks. når jeg tilgår hero.getGrid() fra Normal-klassen returnerer den null, men når jeg tilgår getGrid() fra hero-klassen returnerer den grid, som den skal. Er der nogen der har oplevet lignende problemer eller kender løsningen?
har, som jeg skrev, også prøvet at lave en getGrid() metode i Hero, som bare returnerer this.grid intet virker. hvis jeg tilgår hero's metoder i Normal klassen returnerer de altid null, mens de returnerer det korrekte hvis jeg tilgår dem i dens egen klasse. Jeg går ud fra problemet opstår når jeg giver hero'en med til Normal-klassen. Er det fordi HeroState er et slags "mellem-led" at Hero'ens metoder ikke fungerer i Normal-klassen?
Håber nogen kan hjælpe, da jeg har prøvet ALT uden succes.
Hej xyon, sådan som jeg ser dit problem er at du gør tingene i en forkert rækkefølge. Du skal kigge på hvordan java initialisere de forskellige elementer i en klasse.
prøv at initialisere dine states som det sidste i din konstructor...
public final HeroState NORMAL;
public Hero(int startingPosition) { this.grid = new Point(5, 5); this.currentPosition = startingPosition; NORMAL = new Normal(this); }
her er et komplet eksempel som jeg mener ligger rimeligt tæt på GoF:
public class DemoStatePattern { public static void main(String[] args) { Car c = new Car(); System.out.println(c); c.start(); System.out.println(c); c.stop(); System.out.println(c); c.stop(); // this will throw an exception } }
class Car { private State st; public Car() { st = HoldState.INSTANCE; } void ChangeState(State st) { this.st = st; } public void start() { st.start(this); } public void stop() { st.stop(this); } public String toString() { return (st.getState() + " car"); } }
abstract class State { public void start(Car c) { throw new RuntimeException("Can not start in state " + getState()); } public void stop(Car c) { throw new RuntimeException("Can not stop in state " + getState()); } public abstract String getState(); }
class MoveState extends State { public final static MoveState INSTANCE = new MoveState(); private MoveState() { } public void stop(Car c) { c.ChangeState(HoldState.INSTANCE); } public String getState() { return "moving"; } }
class HoldState extends State { public final static HoldState INSTANCE = new HoldState(); private HoldState() { } public void start(Car c) { c.ChangeState(MoveState.INSTANCE); } public String getState() { return "holding"; } }
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.