检查成员是否已初始化

时间:2014-04-14 14:03:34

标签: java

如果我的memberVariable / memberArray(每个标准类型int / double / float ...等)都是新初始化的,我如何检查Java? Double / Integer / Float有什么区别?

class Class
{
    double[] memberArray;
    double memberVariable;

    Class() { }

    void init()
    {
        memberArray = new double[12];
        //memberVariable = new double(); //EDIT: does not compile
    }

    void foo()
    {
        // check here if memberVariable/memberArray has been new-initialized
    }
}

在ctor中构造这些不是一种选择,目前还不知道数组化。 而且我也想在这里使用原始类型,而不是容器。 这是一个例子,它不太可能在任何项目中使用。

2 个答案:

答案 0 :(得分:4)

不要使用这种构造和初始化模式,因为您的对象在这些点之间处于未定义状态。

init中的功能移至构造函数。

Class() {
     memberArray = new double[12];
     /*this does not compile: memberVariable = new double();*/
}

(并且,如果您希望您的代码在调试期间凌晨3点可读,则将Class重命名为其他类似于关键字的内容。

或者,您可以完全取消构造函数并初始化成员:

    double[] memberArray = new double[12];
    double memberVariable; // no need to initialise: Java sets to zero (unlike C)

这些方法中的任何一种都意味着您无需检查某些内容是否已初始化,因为始终为

最后,如果您事先不知道数组大小,请使用带参数的构造函数:

Class(int size)
{
    memberArray = new double[size];
}

并使用Class foo = new Class(12);调用它来创建一个在数组中包含12个元素的实例。

答案 1 :(得分:1)

有两种基本类型的变量被赋予不同的默认值作为成员变量(当它们不是成员/实例变量时,它们根本没有给出默认值)。这两种类型是引用变量和原始变量。

参考变量'参考'作为对象的变量(任何非原始的)。所有其他人都是原始人。

基元的默认值为0,boolean除外,其默认值为false。参考值的默认值为null,表示不引用任何对象。

因此,如果您想检查引用变量(,例如您的双打数组)是否已使用除null之外的任何其他值进行初始化,您只需检查它是否为{{1 }} 或不。像这样;

null

如果要检查您的基元(例如双重)是否已被赋予非默认值,您可以检查它们是否与默认值不同。例如;

if(memberArray==null){ 
    /* Do something if it hasn't been given a non-default value */ 
}

但请注意,因为您可以为它们提供一个与之后默认值相同的值。或者,Java具有Wrapper类,允许您使用引用变量来引用基元,例如if(memberVariable==0) { /* Do something if it's still 0 */ } 而不是Double .Java区分大小写)。这样,您可以检查您的double引用变量是否为空。

正如其他人所说,最好创建一个构造函数来确保它们会被某些值初始化。