从方法初始化的Java final实例变量

时间:2013-09-10 11:39:31

标签: java android final

我需要在一个类中创建一个最终字符串并在一个方法中初始化它,我在网上搜索一些说可能有些人说不是!
我通过了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()

任何想法?

4 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:4)

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

如果您可以使用常规方法初始化它,那么让我们在对象创建和使用过程中分析最终变量的值:

  1. 创建了对象,最终成员的值未初始化,因此为null;
  2. 构造函数返回,该对象由其余代码使用。最后一个变量也被使用。
  3. 您调用的方法为最终成员分配值。最终价值会有效变化。

答案 2 :(得分:0)

您也可以使用构造函数

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)
    { ....

    }
}

答案 3 :(得分:0)

来自JLS:

  

最终变量只能分配一次。

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

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