Java Android:在MainActivity中注销时重置类变量

Java Android:在MainActivity中注销时重置类变量,java,android,Java,Android,我只是想问你一个更好的方法,当用户想要注销时重置MainActivity的所有类变量,而不是我在这里介绍的方法 public class MainActivity extends AppCompatActivity{ public static String userId; private ArrayList<String> list1 = new ArrayList<>(); priva

我只是想问你一个更好的方法,当用户想要注销时重置MainActivity的所有类变量,而不是我在这里介绍的方法

    public class MainActivity
            extends AppCompatActivity{


        public static String userId;
        private ArrayList<String> list1 = new ArrayList<>();
        private ArrayList<String> list2 = new ArrayList<>();
        private Prefs prefs;


        private void logOut(){
            userId = null;
            list1 = new ArrayList<>();
            // Helperlist of all the Ids in "friends"
            list2 = new ArrayList<>();
            prefs = null;

            onCreate(null);
        }
    }
公共类活动
扩展AppCompative活动{
公共静态字符串用户标识;
private ArrayList list1=新的ArrayList();
private ArrayList list2=新的ArrayList();
私人优先权;
私有无效注销(){
userId=null;
list1=新的ArrayList();
//“朋友”中所有ID的帮助列表
list2=新的ArrayList();
prefs=null;
onCreate(空);
}
}
类变量userId、list1、list2和prefs是为特定用户设置的。如果用户注销,则应为“null”。 这里的问题是,每次我想添加一个类变量时,在logOut()中也必须将其设置为“null”。如果我要添加越来越多的类变量,这可能是一个容易产生错误的来源。你能给我一个更好的方法吗

谢谢


Ayox

我建议不要对类变量使用
static
(如
userId


此外,由于类变量存储会话相关数据,因此可以将其存储在
SharedReferences
中,并在注销时调用
prefs.clear()
,其中
clear()
方法可以定义为类似
SharedReferences\edit().clear().apply()的内容

我想不出比实现一个
可关闭的
接口更好的解决方案,在
close()
方法中清除变量,然后在注销时调用它。
我建议重命名/删除
logOut
方法,因为它还有其他功能,可能它的职责在另一个类中

一项建议是,自己调用Android生命周期方法被认为是一种“糟糕的做法”

我建议您将所有自定义初始化提取到一个自定义方法,然后从
logOut()调用它


希望有帮助

您可以使用反射重置所有实例变量。这不是一个优雅的解决方案,但它将确保所有变量都为空

Field[] fields = object.getClass().getDeclaredFields();
for (Field f : fields) {
  f.setAccessible(true);
  f.set(object, null);
}

当类被销毁时,类变量的作用域结束。如果你在同一个活动中保持注销和登录,那么除了我没有其他方法之外,没有别的方法。静态:是的,我必须改变它,在我的ToLoistSyrdPosiy上:惯于帮助或者有点复杂,因为我也有来自自己创建的对象的变量,但是我会考虑它。如果没有更好的解决方案,为什么这是一种不好的做法?或者它的缺点是什么?因为它们是回调方法,Android系统会在应用程序执行的确定点调用它们,例如,当创建活动或恢复活动时。这是一种非常好且简单的方法。为什么它不被认为是“优雅的”?因为反射会使代码慢一点。因此,这是在速度和方便之间的权衡;我想补充一点,还有安全限制和内部暴露: