State in Java

Why read if you can watch?

Watch State's video tutorial
read full article

The beginning of a case statement has taken seed in Property.landOnBy()

This can be remedied with the State design pattern.

class Player {
private String name;
private int money;
public Player( String n, int m ) { name = n; money = m; }
public String getName() { return name; }
public int getWorth() { return money; }
public void debit( int m ) { money -= m; }
public void credit( int m ) { money += m; }
}

class Property {
private String name;
private int price;
private int rent;
private Player owner;
public Property( String n ) {
name = n;
price = 100;
rent = 10;
}
public String getName() { return name; }
public int getPrice() { return price; }
public int getRent() { return rent; }
public Player getOwner() { return owner; }
public void setOwner( Player p ) { owner = p; }
void landOnBy( Player p ) {
System.out.print( p.getName() + " landed on " + name );
if (getOwner() == null) {
System.out.print( " - not owned\n" + p.getName() );
if (p.getWorth() < getPrice()) {
System.out.println( " does not have enough money to purchase" );
} else {
p.debit( getPrice() );
setOwner( p );
System.out.println( " bought " + getName() );
}
} else {
System.out.println( " - owned by " + getOwner().getName() );
if (p != getOwner()) {
p.debit( getRent() );
getOwner().credit( getRent() );
System.out.println( getOwner().getName() + " now has "
+ getOwner().getWorth() + " dollars" );
} }
System.out.println( p.getName() + " has " + p.getWorth()
+ " dollars" );
} }

public class StateDisc {
public static void main( String[] args ) {
Player p1 = new Player( "Tom", 50 );
Player p2 = new Player( " Dick", 500 );
Property prop = new Property( "Boardwalk" );
prop.landOnBy( p1 );
prop.landOnBy( p2 );
prop.landOnBy( p1 );
prop.landOnBy( p2 );
prop.landOnBy( p1 );
} }

Tom landed on Boardwalk - not owned Tom does not have enough money to purchase Tom has 50 dollars Dick landed on Boardwalk - not owned Dick bought Boardwalk Dick has 400 dollars Tom landed on Boardwalk - owned by Dick Dick now has 410 dollars Tom has 40 dollars Dick landed on Boardwalk - owned by Dick Dick has 410 dollars Tom landed on Boardwalk - owned by Dick Dick now has 420 dollars Tom has 30 dollars