Java - расширенный статический класс нестатического класса - PullRequest
1 голос
/ 12 июня 2011

У меня есть класс 'Character', Character не является статичным.Я хочу, чтобы мой класс игрока расширял Характер, но также был статичным.

Я хочу, чтобы все другие объекты и классы могли иметь доступ к игроку без необходимости создавать и передавать экземпляр игрока.

Как лучше всего добиться этого?

Ответы [ 2 ]

3 голосов
/ 12 июня 2011

Единственный хороший способ, который я могу придумать, это на самом деле не расширение, а обертка:

class Player {
    private final static Charachter me = new Character();

    public static doSomething(){ me.doSomething(); }
}

Конечно, вы также можете расширять И обтекание:

class Player extends Character {

    private final static Player me = new Player();

    // if you don't want anyone creating player objects
    // make the constructor private:
    private Player(){ super(); }

    public void doSomething(){
        // stuff
    }

    public static void staticDoSomething(){ me.doSomething(); }
}

Или, собственно, поскольку ваша цель состоит в том, чтобы просто гарантировать наличие одного объекта игрока, вы можете забыть о том, чтобы сделать методы статичными, но скрыть конструктор (ы):

class Player extends Character {

    private static Player thePlayer = null;

    public static Player getPlayer(){
        if( thePlayer == null ){
            // Create the player
            thePlayer = new Player();
        }
        // There is a valid player object, so return it.
        return thePlayer;
    }

    // hide the constructor(s) by making them private:

    private Player(){ super(); }
}

Это гарантирует, что единственный способ получитьPlayer должен вызывать Player.getPlayer(), и он всегда дает вам один и тот же объект (вы никогда не создаете больше одного).

2 голосов
/ 12 июня 2011

На самом деле кажется, что вы просто хотите глобальную переменную.Это часто достигается с помощью шаблона Singleton:

public class Player extends Character {
    private static final Player humanPlayer = new Player();

    private Player() {
    }

    public static Player getHuman() {
        return humanPlayer;
    }

    //...
}

//...
Player.getHuman().move(2);

Для этих методов в Player не должно быть большой необходимости быть статичными.Вы жертвуете хорошим дизайном ради крошечного удобства (это, вероятно, укусит вас позже в любом случае).

Лично я предпочитаю внедрение зависимостей по глобальному состоянию в 95% случаев.Когда метод должен иметь доступ к проигрывателю, передайте его. Это позволит вам намного проще протестировать свой код и сделает его более удобным для изменения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...