Avatar billede xyon Nybegynder
11. maj 2006 - 11:29 Der er 8 kommentarer

State-pattern problem

Hej folkens,

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?
Avatar billede arne_v Ekspert
11. maj 2006 - 13:05 #1
må vi se lidt mere kode ?
Avatar billede xyon Nybegynder
11. maj 2006 - 13:48 #2
public class Hero {

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;

public Grid grid;

public Hero(int startingPosition) {
    this.grid = new Grid(5,5);
    this.currentPosition = startingPosition;
   
}
private void setNormalState() {
        this.state = NORMAL;

public static void main(String[] args) {
    Hero hero = new Hero();
Avatar billede xyon Nybegynder
11. maj 2006 - 13:48 #3
public abstract class HeroState {}
Avatar billede xyon Nybegynder
11. maj 2006 - 13:51 #4
public class Normal extends HeroState{
   
        private Hero hero;
   
    private int northField;
    private int southField;


public Normal(Hero hero) {
  this.hero = hero;
  this.northField = hero.grid.getWidth();
  this.southField = hero.grid.getWidth(); }

}
Avatar billede xyon Nybegynder
11. maj 2006 - 13:55 #5
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.
Avatar billede snoop_one Nybegynder
11. maj 2006 - 17:23 #6
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);
}
Avatar billede arne_v Ekspert
12. maj 2006 - 03:38 #7
vi kan ikke se meget ud af din kode

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";
    }
}
Avatar billede arne_v Ekspert
19. juni 2006 - 00:13 #8
xyon ?
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester