Java 在Android Studio应用程序中创建对象的全局实例
我正在安卓工作室设计一款游戏。我有一个活动,上面有多个片段。我还有一个玩家对象,我想创建一个实例Java 在Android Studio应用程序中创建对象的全局实例,java,android-studio,Java,Android Studio,我正在安卓工作室设计一款游戏。我有一个活动,上面有多个片段。我还有一个玩家对象,我想创建一个实例 Player player1 = new Player(); “我的活动”中的所有这些Fragmenet都将对player1进行更改。 而不是通过以下方式将此对象传递给每个片段和后续活动: intent.putExtra("Player",player1); 有没有一种方法可以从其他片段和活动中访问player1,而不用使用putExtra()方法传递它 我尝试使player1成为静态: sta
Player player1 = new Player();
“我的活动”中的所有这些Fragmenet都将对player1进行更改。
而不是通过以下方式将此对象传递给每个片段和后续活动:
intent.putExtra("Player",player1);
有没有一种方法可以从其他片段和活动中访问player1,而不用使用putExtra()
方法传递它
我尝试使player1成为静态:
static Player player1 = new Player();
但是,我无法从其他.java
活动文件访问player1
所以,基本上,我想要一个策略,使player1
成为一个全局对象,我可以随时随地引用它。我不想让Player类中的所有方法都是静态的,因为我想在我的游戏中有player1
、player2
和player3
文件,所以我需要能够创建一个Player
的实例,如果每个方法都是静态的,我认为这是不可能的(对吧?)
我刚刚开始OOP,所以我确信有一些简单的东西我忽略了,或者,也许有一种更好的方法来实现我想要的东西,而不是与修饰符混为一谈。也许通过使用接口?接口将如何工作
如何通过创建扩展应用程序的类将信息存储在应用程序对象中 如果你想在任何地方访问它,并且不关心隐私,你需要将它公开
public static Player player1 = new Player();
默认值为仅包级访问
您可以在其他类中使用此语法来访问它:
Activity1.player1; // do something...
注意:可能有更好的设计方案,只需将字段公开
,就可以在任何地方访问它,但这是所需的最低限度。不建议以这种方式进行,因为您正在学习,您可能希望阅读其中一些设计概念
例如,使用公共getter/setter通常是访问类/实例字段的更常见的方法之一
private static Player player1 = new Player();
public static Player getPlayer1() { return player1; }
public static void setPlayer1(Player p) { player1 = p; }
// ...
所以,基本上,我想要一个策略,使player1成为一个全局对象,我可以随时随地引用它。我不想让Player类中的所有方法都是静态的,因为我想在我的游戏中有player1、player2和player3文件,所以我需要能够创建一个Player实例,如果每个方法都是静态的,我认为这是不可能的(对吗?
不,那不是真的。只要有一个公共构造函数和/或它不是抽象的,就可以实例化带有静态
方法的类static
只是意味着它是在类级别访问的,不需要实例,尽管您仍然可以从对象引用访问static
方法<但是,代码>静态也意味着所有实例共享相同的字段,因此在类的所有实例中只有一个字段、方法等
一个你可以考虑使用的设计模式是模式,它允许你在需要时获得一个类的单个实例,这样就不需要干扰静态属性和方法(如果你不需要使用它,它可能会有缺陷)。 如何通过创建扩展应用程序的类将信息存储在应用程序对象中
根据,这是一种可以接受的方法,尽管您可能仍然希望考虑一些总体设计选择,并确定这是否真的是您想要走的路线 用于需要维护全局应用程序状态的基类。您可以通过在AndroidManifest.xml的标记中指定其名称来提供自己的实现,这将导致在创建应用程序/包的流程时为您实例化该类如果其他人想知道,另一个解决方案是让你的类(
MyClass.java
)添加扩展应用程序
,然后转到你的android清单并添加android:name
参考:
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme"
android:name="companyname.projectname.MyClass">
<activity
android:name=".MyActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
这将在应用程序的整个生命周期中保持对象实例。它可以工作,但我喜欢上面解释的静态方法。另外,我不确定这是否是一种理想的方法…出于测试目的:在Activity1中,我有一行:
publicstaticplayer1=newplayer()代码>。我还有一个指向Activity2的按钮。按下按钮时,Activity2出现,在onCreate
覆盖方法中,我有一行player1。setName(“mike”)
其中setName(String name)
是Player
类中的public
方法。然而,我在这一行得到一个“无法解决”错误,这意味着声明player1
为public static
不起作用-或者我遗漏了一些东西@瑞安_J@MikeJamesJohnson您不能简单地在任何类中使用player1
,并对其进行解析,因为该语法默认为方法/类范围(仅在该类中声明的字段)。您需要通过定义它的类来访问它<代码>活动1.player1.setName(“mike”)代码>相当于…@Ryan_J ahhh!!是的,我完全忘记了。谢谢。可能不是最好的方法,因为播放器
不是一个应用程序,但是在上下文中看到它的使用是很好的。
Player player = (Player)getApplication();