当我编写方法或使用成员变量时,我经常发现我需要在应用程序中共享它们。但他们应该去哪里?
我可以将Activity子类化,但是一旦我使用MapView并且被迫使用MapActivity就会失败,所以我的所有活动都不会从我的子类继承。我有办法解决这个问题吗?
在继承不适用的情况下,我倾向于将泛型方法和成员变量放入Application对象的子类中,但我发现它创建了一堆代码,因为每个类都需要获取对应用程序的访问权限通过上下文对象,或者我必须将其传递下去。
我怀疑我最好创建MyApplication.getInstance()并将所有内容保存在单例中,而不是通过应用程序类传递应用程序对象。但在我想看看你们要说些什么之前。
答案 0 :(得分:5)
如果您想要访问活动之外的“Global Singleton”并且您不希望通过所有涉及的对象传递Context
来获取单例,您可以如您所述定义,应用程序类中的静态属性,它保存对自身的引用。只需在onCreate()
方法中初始化属性。
例如:
public class ApplicationController extends Application {
private static ApplicationController _appCtrl;
public static ApplicationController getAppCtrl()
{
return _appCtrl;
}
}
资源的一个示例:因为Application
的子类也可以获取资源,所以只需在定义静态方法时就可以访问它们,返回它们,如:
public static Resources getAppResources()
{
return _appCtrl.getResources();
}
答案 1 :(得分:2)
对于全局方法,请使用静态方法的静态Util
类。如果你不能使用静态方法,那么方法首先不应该是全局的,并将它们放在有意义的类中。
答案 2 :(得分:0)
首先阅读:
How to declare global variables in 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 );
我可以为player1和player2重用playTurn(),我不需要改变它。我只需要更改该方法的客户端。
大多数情况下,你是懒惰的,并且想要获得对某个对象的引用,而全局变量是获取对已知对象的引用的快速方法。相反,最好让一个类在启动时或在有意义的时候解析应用程序中的依赖关系。然后只有那一个地方了解你的代码是如何组合在一起的。例如,
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只是我们在游戏中创建的一个普通旧对象。
我希望你能开始看到这是开发软件的更好方法。你可能不会理解它,但如果你想到它会更有意义。这是非常微妙的变化,但非常强大。