2015-11-18 3 views
-3

У меня есть этот абстрактный класс:Java значение уник Объект

public abstract class Pile { 

    protected Deck d=new Deck(); 

    public Pile(){ 

    } 
    public abstract void PrintCard(); 
    public abstract boolean IsEmpty(); 
} 

Я хочу d поле и его значение будет одинаковым для всех объектов типа Pile (и его подклассов).

Я хочу, чтобы это произошло, потому что я удаляю карты и добавляю их в колоду, поэтому она должна быть только одной колодой.

+4

... сделать его 'статическим'? Или введите «Deck» в качестве параметра «Pile». –

+0

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

+1

Нет, это не так. Тем не менее, каждый экземпляр «Pile» будет использовать ту же «Deck», что не всегда может быть хорошо. Думаю об этом; у вас есть комната, полная различных групп людей, играющих множество карточных игр. У каждой группы есть своя «колода» или все группы рисуют из одной «колоды», расположенной на столе посреди комнаты? – JonK

ответ

2

Самый простой способ просто сделать dstatic (это также стоит сделать его final, так что ни один подкласс не может заменить его другим экземпляром):

public abstract class Pile { 
    protected static final Deck d=new Deck(); 

    public abstract void PrintCard(); 
    public abstract boolean IsEmpty(); 
} 

Однако статические переменные, как это может быть проблематичным , особенно с точки зрения тестирования. Также сложно изменить позже, если вам понадобится Pile s, чтобы иметь один Deck, в то время как другие имеют разные Deck (например, пример JonK).

Вы можете альтернативно вводить Deck в качестве параметра:

public abstract class Pile { 
    protected final Deck d; 

    public Pile(Deck d) { 
    this.d = d; 
    } 

    public abstract void PrintCard(); 
    public abstract boolean IsEmpty(); 
} 

Теперь вы можете вводить значения по вашему выбору (например, макет), когда вы строите Pile. Второе решение - это то, что я бы выбрал.

+3

Во-вторых, это гораздо лучшее решение. –

+0

Второе решение здесь не только легче работать, но также позволяет KISS (держать его простым, глупым) –

+0

Мне нужно изменить колоду, чтобы я не мог сделать ее окончательной, я думал, что ваше второе решение, но у меня 4 разных свай с 3-мя объектами, необходимыми для каждого из них, поэтому не так просто вставить колоду, как это, в основном за один сеанс мой класс колоды содержит массив разных карт, и у меня есть некоторые методы для удаления и добавления карт, если я делаю палубу окончательной я смогу позвонить им? –

Смежные вопросы