Challenges

Remember the rules for this are

  • Try to use only the information given up to this point in this book.
  • Try not to give up until you've given it a solid attempt

Challenge 1.

As written the code in GameConsole.Controller looks at its own isPoweredOn field.

Disambiguate the usage so that it is uses the isPoweredOn field from the GameConsole instance wrapping it in its status method.

class GameConsole {
    boolean isPoweredOn;

    GameConsole() {
        this.isPoweredOn = false;
    }

    class Controller {
        boolean isPoweredOn;

        Controller() {
            this.isPoweredOn = false;
        }

        String status() {
            "Controller[" 
                + isPoweredOn ? "ON" : "OFF" + "] - GameConsole["
                + isPoweredOn ? "ON" : "OFF" + "]";
        }
    }
}

class Main {
    void main() {
        var console = new GameConsole();
        var controller = console.new Controller();

        IO.println(controller.status());

        console.isPoweredOn = true;
        IO.println(controller.status());

        controller.isPoweredOn = true;
        IO.println(controller.status());

        console.isPoweredOn = false;
        IO.println(controller.status());
    }
}

Challenge 2.

Make the Controller class from the previous example a static inner class. The status method should keep the same behavior. This means you will need to explicitly pass an instance of GameConsole to the constructor of Controller and store it in a field.

Challenge 3.

Successfully make an instance of Fly from the Main class.

class OldLady {
    class Horse {
        class Cow {
            class Goat {
                class Dog {
                    class Cat {
                        class Bird {
                            class Spider {
                                class Fly {
                                    Fly() {
                                        IO.println("She's dead, of course");
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

class Main {
    Fly f = /* CODE HERE */;
    IO.println(f);
}

Challenge 4.

Go back to some of the programs you wrote entirely within the anonymous main class. Turn that main class into a named class.

First make sure your program works the same as it did. Then go through all the inner classes in your program and mark them as many of them as you can static.

Which ones can't be trivially made static? Note what state they access in the enclosing instance.