2014-04-14 29 views
-2

如果我的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

你想让'memberVariable'成为'Double'还是'double'?因为这会影响答案。 – Keppil

+0

那么,考虑到这个代码甚至不会编译,你不会。除此之外......在Java中有'null'的概念。你应该看看它。 –

+1

各种各样的事情:请不要叫'Class'类 - 它会在以后混淆你。你有没有在编译器中试过这个?你会得到什么错误?你做了什么来尝试解决这些错误? –

回答

1

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

引用变量'引用'是对象的变量(任何不是基本的东西)。所有其他人都是原始人。

基元给出默认值0,除了boolean,其默认值为false。参考值的默认值为null,这意味着不参考任何对象。

所以,如果你想检查是否引用变量(如您双打数组)已经比null任何其他值初始化你可以简单地检查它是否是null与否。像这样;

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

如果你想检查是否您的原语(如你的双)已经给了你可以检查它们是否不同于默认非默认值。例如;

if(memberVariable==0) { 
    /* Do something if it's still 0 */ 
} 

虽然会被警告,因为您可以给它们一个与以后默认相同的值。或者,Java有Wrapper类,允许您使用引用变量来引用基元,如Double而不是double。Java区分大小写)。这样你可以检查你的Double引用变量是否为空。

正如其他人所说,尽管创建一个构造函数确保他们得到初始化与某些值。

+0

+1 - 可能值得补充的是,使用'Double'代替允许'null'检查。 –

+0

@BrianRoach - 好点。我会简要地提及包装类。 –

+0

'if(memberArray == null)'那就是我在找的东西,谢谢。 – Buni

4

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

将您的功能转移到构造函数init

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

(而且,如果你想调试然后重命名Class到别的东西在你的代码可读性在凌晨3点少关键字等)。

或者,您也可以不设构造完全和初始化成员:

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种元素的实例。

+0

“Java有构造函数的原因” - 我的回答现在已经过时 – Rogue

+0

我不能在ctor中构造它,因为此时数组的大小尚未知道。 – Buni

+0

@Bathsheba我在发表评论时发现了你的编辑权:) –