如何在Java中实现单个全局变量
我现在正在做一个安卓项目,我正在使用Firebase。我将在应用程序的大多数如何在Java中实现单个全局变量,java,android,firebase,firebase-realtime-database,firebase-authentication,Java,Android,Firebase,Firebase Realtime Database,Firebase Authentication,我现在正在做一个安卓项目,我正在使用Firebase。我将在应用程序的大多数活动中使用FirebaseAuth和FirebaseDatabase,我必须在活动的每个基础类中设置它们的实例,这似乎很奇怪 有没有一种方法可以在我的项目中实例化这些对象的单个全局实例,以便我可以在整个项目中引用它们 我想我会在某个地方创建一个静态类,比如 public static class GlobalVars { public static final FirebaseAuth AUTH = Fireba
活动中使用FirebaseAuth和FirebaseDatabase
,我必须在活动的每个基础类中设置它们的实例,这似乎很奇怪
有没有一种方法可以在我的项目中实例化这些对象的单个全局实例,以便我可以在整个项目中引用它们
我想我会在某个地方创建一个静态类,比如
public static class GlobalVars {
public static final FirebaseAuth AUTH = FirebaseAuth.getInstance();
public static final FirebaseDatabase DB = FirebaseDatabase.getInstance();
}
然后我会在另一个类中使用
GlobalVars.AUTH
但我不确定这是否是一个好的编程实践
谢谢你的帮助
谢谢:)您应该使用Singleton,最好的方法是使用Enum。查看有效Java,第二版,第3项-使用私有构造函数或枚举类型强制singleton属性
public enum FireBase {
INSTANCE;
public void firebaseInstace() {
// Your code goes here...
}
}
PS:还想补充一点,使用Enum将保证您的类受到序列化或反射攻击的保护。您应该使用Singleton,最好的方法是使用Enum。查看有效Java,第二版,第3项-使用私有构造函数或枚举类型强制singleton属性
public enum FireBase {
INSTANCE;
public void firebaseInstace() {
// Your code goes here...
}
}
PS:还想补充一点,使用Enum将保证您的类受到序列化或反射攻击的保护。您可以使用单例。要创建它,可以使用以下代码:
public static class FirebaseAuth {
private FirebaseAuth instance;
private FirebaseAuth() {
// private constructor that nobody else can create an instance of your class
}
public static FirebaseAuth getInstance() {
if (instance == null) {
//create instance if necessary
instance = new FirebaseAuth();
}
return instance;
}
}
但是你的代码也在工作。尽管如此,我还是赞同单例模式,因为它对大多数程序员来说是众所周知的
编辑:正如@joshsp98所指出的,单身被认为是不好的做法。提供了关于何时使用单例和何时避免单例的非常好的信息
另外@Klitos Kyriacou指出Firebase已经内置了这一功能,所以不妨尝试一下?你可以使用一个单例。要创建它,可以使用以下代码:
public static class FirebaseAuth {
private FirebaseAuth instance;
private FirebaseAuth() {
// private constructor that nobody else can create an instance of your class
}
public static FirebaseAuth getInstance() {
if (instance == null) {
//create instance if necessary
instance = new FirebaseAuth();
}
return instance;
}
}
但是你的代码也在工作。尽管如此,我还是赞同单例模式,因为它对大多数程序员来说是众所周知的
编辑:正如@joshsp98所指出的,单身被认为是不好的做法。提供了关于何时使用单例和何时避免单例的非常好的信息
此外,@Klitos Kyriacou指出Firebase已经内置了此功能,因此不妨尝试一下?获取Firebase功能实例的代码经过优化,可以频繁调用。在每个需要它的类中调用FirebaseAuth.getInstance()
完全可以
对于我使用的每个Firebase功能,我倾向于为每个类提供一个成员字段,然后在构造函数或onCreate()
中初始化该字段,并在该类的其他地方使用。用于获取Firebase功能实例的代码经过优化,可以频繁调用。在每个需要它的类中调用FirebaseAuth.getInstance()
完全可以
对于我使用的每个Firebase功能,我倾向于为每个类提供一个成员字段,然后在构造函数或onCreate()
中初始化该字段,并在该类的其他地方使用。我认为您希望使用singleton
这种方法会奏效。你甚至可以做一个静态导入,这样你就可以在你的类中将它引用为“AUTH”。singleton不是一个坏习惯吗?你可以让它们都从某个父类中派生出来……我想:)Firebase本身使用singleton,所以你不必;-)-FirebaseDatabase.getInstance()和FirebaseAuth.getInstance()将在每次调用时返回相同的实例。您是按照上面的操作并将它们分配到最终字段,还是在每次需要时在代码中调用它们,取决于您。我认为您希望使用singleton
这种方法会奏效。你甚至可以做一个静态导入,这样你就可以在你的类中将它引用为“AUTH”。singleton不是一个坏习惯吗?你可以让它们都从某个父类中派生出来……我想:)Firebase本身使用singleton,所以你不必;-)-FirebaseDatabase.getInstance()和FirebaseAuth.getInstance()将在每次调用时返回相同的实例。您是按照上面的操作并将它们分配给最终字段,还是在每次需要时在代码中调用它们,这取决于您。好的,这是有意义的。正如我在上面所评论的,单身不被视为坏习惯吗?什么时候是使用它的好时机,什么时候不是?FirebaseAuth是一个现有的第三方类,而不是OP将要编写的类。@joshsp98我非常喜欢那篇文章:我在决定是否使用Singleton时总是使用它,但大多数时候我还是尽量避免it@Klitos我对firebase没有太多经验,因此我不知道这一点。但答案仍然回答了这个问题:“如何在Java中实现单个全局变量”对于未来的知识,我将把它标记为一个答案,因为它回答了我关于全局变量的问题,但并不特定于我的Firebase案例。考虑到其他人的意见,我将坚持我的解决方案。好的,这是有道理的。正如我在上面所评论的,单身不被视为坏习惯吗?什么时候是使用它的好时机,什么时候不是?FirebaseAuth是一个现有的第三方类,而不是OP将要编写的类。@joshsp98我非常喜欢那篇文章:我在决定是否使用Singleton时总是使用它,但大多数时候我还是尽量避免it@Klitos我对firebase没有太多经验,因此我不知道这一点。但答案仍然回答了这个问题:“如何在Java中实现单个全局变量”对于未来的知识,我将把它标记为一个答案,因为它回答了我关于全局变量的问题,但并不特定于我的Firebase案例。考虑到其他人的意见,我将坚持我的解决方案。我没有因为这一点而投反对票