2012-04-20 2 views
3

Я создаю экземпляры класса с расширением Button и обращаясь к целочисленной переменной непосредственно для лучшей производительности. Я использую константы, чтобы легко определить текущую настройку переменной.Совместное использование констант в нескольких классах (андроид-тральщик)

У меня есть константы, объявленные как классом Button, так и классом Activity, который их создает. Я нашел похожие вопросы и прочитал, что не очень хорошая практика создавать класс, чтобы просто удерживать константы.

Каков наилучший способ использования одного и того же объявления констант в обоих классах?

Я начинающий программист, поэтому вполне возможно, что я пропустил простое решение.

класса Button: класс

public class GridButton extends Button { 
    public int displayStatus; 

    // constants for mine display status 
    private static final int UNTOUCHED = 1; 
    private static final int UNCOVERED = 2; 
    private static final int FLAGGED = 3; 
    private static final int HIT = 4; 
    ... 
} 

активность:

public class PlayGameActivity extends Activity {  
    private GridButton[][] gridButtons;  

    // constants for mine display status 
    private static final int UNTOUCHED = 1; 
    private static final int UNCOVERED = 2; 
    private static final int FLAGGED = 3; 
    private static final int HIT = 4; 
    ... 

    // e.g. accessing displayStatus value 
    if (gridButtons[currentRow][currentColumn].displayStatus == FLAGGED) 
    { 
    } 
} 
+2

сделать эту публикацию открытой в классе 'GridButton', а затем использовать em в' PlayGameActivity' следующим образом: 'GridButton.UNTOUCHED' – Selvin

+0

любое доказательство для этого -> ** Я нашел похожие вопросы и прочитал, что это не хорошая практика, чтобы создать класс, чтобы просто удерживать константы **? – waqaslam

+0

@Waqas [stackoverflow1] (http://stackoverflow.com/questions/66066/what-is-the-best-way-to-implement-constants-in-java) [stackoverflow2] (http://stackoverflow.com/questions/3866190/java-constants-file) – Ivan

ответ

8

Чтобы разделить вещи, вы могли бы сделать константы в отдельный класс и доступ к нему статически

class Constants { 
    public static final int UNTOUCHED = 1; 
} 

, а затем в обоих классах вы могли бы пойти Constants.UNTOUCHED.

В этом случае я бы избегал использовать магические числа и заменять их Enum.

enum DisplayStatus { 
    Untouched, Uncovered, Flagged, Hit 
} 

И заменить все ваши int displayStatus с DisplayStatus displayStatus. Теперь для вас и других читателей кода явно ясно, что представляет собой int.

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

Удачи вам!

+0

Отличный ответ. Мне сказали, чтобы избежать перечислений из-за хита производительности, однако, кажется, мой лектор, возможно, не был в курсе событий - [stackoverflow] (http://stackoverflow.com/questions/5143256/why-was-avoid-enums- где вы-только-потребность-Ints-удаленной от-андроидов-ЭКСПЛУАТАЦИОННЫЕ) – Ivan

3

Что такое лучший способ использовать ту же постоянную декларацию в обоих классах?

Определить их один раз (например, в PlayGameActivity) и использовать их в обоих местах (путем сбрасывания модификатора private). GridButton может ссылаться на PlayGameActivity.UNTOUCHED и пр., Если вы избавитесь от private.

2

Я думаю, что перечисление является хорошим решением, как упоминалось ранее. Однако, поскольку у вас есть разные состояния кнопок сетки, вы можете рассмотреть возможность использования Java State design pattern. Поскольку вы новичок, как вы говорите, вы можете обнаружить, что это немного запутанно и даже ненужно, но я считаю, что это поможет вам развить надежные навыки программирования. Наконец-то я помню, что я сам разработал тральщик, в простой java, но не для android, и я использовал Observer pattern для кнопок сетки. Когда одна кнопка менялась, она уведомляла соседних, чтобы изменить свое состояние.

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