Сначала прочитайте это:
Как объявить глобальные переменные в Android?
Теперь, почему вы не должны использовать статический синглтон. Использование синглтона - то же самое, что глобальная переменная. Глобальные переменные уменьшают вашу удобство обслуживания, потому что везде, где вы используете глобальную переменную, вы нарушаете модульность или вводите глобальные детали и предположения о вашем общем проекте. Ваша программа не может иметь две из этих переменных, потому что она ищет только в одном месте. Это означает, что ваша программа не может легко адаптироваться, когда у вас есть два экземпляра вместо одного.
Например, скажем, у меня есть метод playTurn (), и я реализую его так:
public void playTurn() {
globalPlayer.incrementClock();
globalPlayer.doSomething();
globalPlayer.doSomethingElse();
}
Теперь, допустим, я хочу добавить второго игрока в микс. Ох, мой метод playTurn () предполагает использование одного игрока только тогда, когда он использует globalPlayer. Если я хочу добавить второго игрока в программу, я должен изменить этот метод. Делайте это много, и ваша программа очень жесткая и негибкая для изменения. Вместо этого, что если бы я сделал это:
public void playTurn(Player player) {
player.incrementClock();
player.doSomething();
player.doSomethingElse();
}
Теперь можно сделать это:
playTurn( player1 );
playTurn( player2 );
Я могу повторно использовать playTurn () для player1 и player2, и мне не пришлось его менять. Мне просто пришлось сменить клиента этого метода.
Большую часть времени вы ленивы и хотите получить ссылку на некоторый объект, а глобальные переменные - это быстрый способ получить ссылки на хорошо известные объекты. Вместо этого лучше иметь один класс, который разрешает зависимости между приложением при запуске или в тот момент, когда это имеет смысл. Тогда только это одно место понимает, как ваш код составлен. Например,
public class Game {
Player player1;
Player player2;
Board board;
public void startGame() {
BlueTooth blueTooth = BlueTooth.getChannel();
player1 = new LocalPlayer();
player2 = new NetworkedPlayer( blueTooth );
board = new Board();
player1.setOpponent( player2 );
player1.setBoard( board );
player2.setOpponent( player1 );
player2.setBoard( board );
}
}
Теперь у каждого есть свои зависимости, и им не нужно использовать статические переменные для поиска ссылок на вещи. Кроме того, player1 не должен знать о таких деталях, как, например, player2 находится в сети, или что он не связан с игрой. Важно отметить, что эти объекты, которые мы подключаем, имеют долгую жизнь, возможно, всю программу, но если им нужно создавать другие вещи во время выполнения, это нормально для них.
Скажем, например, нам нужно создать несколько игроков во время выполнения, основываясь на том, кто присоединяется к игре. Ну, мы могли бы создать PlayerManager, который мы можем создать при запуске, а затем создавать объекты Player на лету. PlayerManager - это простой старый объект, который мы создаем в Game при запуске новой игры.
Надеюсь, вы начнете видеть, что это гораздо лучший способ разработки программного обеспечения. Вы можете не сразу понять это, но если вы подумаете об этом, это будет иметь больше смысла. Это очень тонкое изменение, но очень мощное.