【问题标题】:Is accessing outer class variables without creating objects safe?在不创建对象的情况下访问外部类变量是否安全?
【发布时间】:2015-04-21 10:05:33
【问题描述】:

我想问一下,如果我创建了一个包含一些公共成员的外部类,并且我还在外部类中创建了一个内部类,那么在不实例化的情况下使用外部类变量是否安全? 这两种情况会有什么不同? 由于我在我的应用程序中创建了很多内部类,有时应用程序无法正常工作,我一直怀疑这是由于这个原因,所以我必须实例化它。 假设我有这个类:

  Class x extends Activity
  {
        public sharedPreferences sx;
        protected void onCreate(Bundle savedInstantState)
        {    
             super.onCreate(savedInstantState);
             setContentView(R.layout.activity_x);
             sx=getSharedPreferences("name",Context.MODE_PRIVATE);

        }
        private class y extends AsyncTask<Void,Void,Void>
        {
           @override   
           public void doInBackground(Void... arg0){
                  String name=sx.getString("name",name);
           }

           protected void onPostExecute(Void result) {
                 Toast.makeText(getApplicationContext(),name,Toast.LENGTH_LONG).show();

           }
  }

请指导我。

【问题讨论】:

  • 嗯,在这个例子中,你不能调用doInBackground,除非你已经实例化了y,你也不能实例化y,除非你也实例化了x。所以我看不出你在问什么。
  • 我同意 David 的观点,并想补充一点,您不能确定 sx 是否已在 doInBackground 中正确设置。你应该在使用它之前检查一下。
  • 对不起,它与android有关,我认为没有必要实例化x。
  • 因为x是一个android Activity,你手动没有得到它的实例,我猜OP的意思是:以所示的方式调用sx是正确的或最好在y 内部创建x 实例以访问sx
  • 假设有许多其他类,并且我在某个地方保存了相同包声明下的 shareprefrences 的值。

标签: java android inner-classes


【解决方案1】:

Java 语言允许内部类访问外部类的私有成员。为了弥补差距,编译器生成了几个合成方法:

http://developer.android.com/training/articles/perf-tips.html#PackageInner为例了解更多信息

【讨论】:

    【解决方案2】:

    好吧,您的示例代码正在以不应该的方法正确执行 UI 操作。如果你想对视图做任何事情(例如 Toast,但实际上是任何事情),你会想在 onPostExecuteonProgressUpdate 方法上做。

    像你一样访问SharedPreferences很好

    【讨论】:

    • 是的,我只想知道这个。对于程序错误,抱歉。如果调用 onResume,这些值会被保存吗?
    猜你喜欢
    • 1970-01-01
    • 2012-08-21
    • 2013-10-19
    • 1970-01-01
    • 2015-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多