【问题标题】:Java final instance variable initialized from a method从方法初始化的 Java 最终实例变量
【发布时间】:2013-09-10 11:39:31
【问题描述】:

我需要在一个类中创建一个最终字符串并从一个方法中对其进行初始化,我在互联网上搜索了一些说可能有人说不!
我忽略了this,在接受的答案中,他说构造函数有可能对非构造函数方法只字未提

但是,如果你删除静态,你可以这样做:

class A  {    
    private final int x;

    public A()
    {
        x = 5;
    } }

在 Android 中我想这样做

public class MyActivity extends Activity
{
    final String DOWNLOADS_FOLDER_PATH;
    @Override
    public void onCreate(Bundle savedInstanceState)
    { ....

   DOWNLOADS_FOLDER_PATH=Environment.getExternalStorageDirectory().getPath()+"/downloads/";
    // i cant do that neither
    // DOWNLOADS_FOLDER_PATH="s";
    }
}

我需要从一个方法初始化,因为我有一个调用

Environment.getExternalStorageDirectory().getPath()

有什么想法吗?

【问题讨论】:

  • 为什么投反对票我在发布之前搜索并发布了我的代码和其他代码

标签: java android final


【解决方案1】:

为什么不能立即初始化呢? getExternalStorageDirectory 是静态方法,所以:

static final String DOWNLOADS_FOLDER_PATH = Environment.getExternalStorageDirectory().getPath() + "/downloads/";

【讨论】:

  • 就是这样!我相信我在过去尝试过并且当时无法编译,所以我有一种错觉,它不会工作.. +1 并接受,谢谢
【解决方案2】:

您不能从方法初始化最终变量 - 只有构造函数和初始化程序块。 这样做的原因是变量在其所属对象的整个生命周期内不得更改其值('final' 关键字背后的含义)。

如果可以用普通方法初始化,我们来分析一下在对象创建和使用过程中最终变量的值:

  1. 对象创建完成,final成员的值没有初始化,所以为null;
  2. 构造函数返回,对象被其余代码使用。也使用了 final 变量。
  3. 您调用了一个为最终成员分配值的方法。最终值实际上发生了变化。

【讨论】:

    【解决方案3】:

    你也可以使用构造函数

    public class MyActivity extends Activity
    {
        final String DOWNLOADS_FOLDER_PATH;
    
        // constructor
        MyActivity(){
           super();
           DOWNLOADS_FOLDER_PATH=Environment.getExternalStorageDirectory().getPath()+"/downloads/";
        } 
    
        @Override
        public void onCreate(Bundle savedInstanceState)
        { ....
    
        }
    }
    

    【讨论】:

      【解决方案4】:

      来自 JLS:

      最终变量只能分配一次。

      但是在这里,如果您在构造函数以外的任何方法中为最终变量赋值,那么它可能会被重新赋值。这就是为什么除了构造函数之外的方法中不允许最终变量赋值的原因。

      构造函数确保为每个新的最终变量完成分配。

      【讨论】:

        猜你喜欢
        • 2016-02-13
        • 2013-07-04
        • 1970-01-01
        • 2013-08-14
        • 2014-09-14
        • 2016-10-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多