Совместное использование констант в нескольких классах (android minesweeper)

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

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

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

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

Класс кнопки:

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; ... // eg accessing displayStatus value if (gridButtons[currentRow][currentColumn].displayStatus == FLAGGED) { } } 

Чтобы поделиться вещами, вы можете сделать константы в отдельном классе и получить доступ к нему статически

 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 ).

Удачи!

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

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

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