2010-04-26 186 views
1

好吧,这只是一个黑暗中的镜头,但它可能是导致大部分错误获得的原因。初始化变量的正确方法

当你初始化的东西。可以说一个小型的挥杆计划。它会是这样的

variables here 
{ 
    private Jlist contactList; 
    String [] contactArray; 
    ArrayList <String> contactArrayList; 
    ResultSet namesList 


// constructor here 

public whatever() 
{ 
    GridLayout aGrid = new GridLayout(2,2,10,10); 

    contact1 = new String(); 
    contact2 = new String(); 
    contact3 = new String(); 

    contactArrayList = new ArrayList<String>(); 

// is something supposed too go in the() of this JList? 
    contactList = new JList(); 

    contactArray = new String[5]; 

    from1 =new JLabel ("From: " + contactArray[1]); 



gridlayout.add(components)// theres too many components to write onto SO. 

} 


// methods here 

public void fillContactsGui() 
{ 
    createConnection(); 
ArrayList<String> contactsArrayList = new ArrayList<String>(); 

    while (namesList.next()) 
    { 
     contactArrayList.add(namesList.getString(1)); 
     ContactArray[1] = namesList[1]; 
    } 
} 

我知道这可能是一个庞大的初学者的问题,但是这是得到的代码IVE太习惯。即时初始化三四次没有意义,因为我不知道他们在哪里gp。任何人都可以对此有所了解吗?

p.s.对于混乱的示例代码感到抱歉。我尽力了。


确定这里有一点更清楚。

代码的总体布局是什么我问。

我的代码格式化为这样。

变量; 构造函数; 方法;

,我会是正确的说法应该是这样的

public class test 
{ 
    int i; 

    public test() 
    { 
    i = 0; 
} 

    public void addi() 
    { 
    i = i +1; 
    } 
} 

,而不是像这样

public class test 
{ 
    int i = 0; 

    public test() 
    { 
    int i = 0; 
    } 


    public void addi() 
    { 
    int i = i +1; 
    } 
} 

IM试图找出初始化变量的正确方法。因为即时定义他们每次我使用它们

+0

你的问题对我来说不是很清楚。什么是你收到的错误信息? – CoolBeans 2010-04-26 16:25:21

+0

这是你的代码或只是一个片段?很难看到你的代码实际上在做什么,因此我们很难帮助你。 – 2010-04-26 16:28:03

+0

你是问“这是否会像这样”,而不是一个特定的方式,或只是一般?如果只是一般情况下,这些问题之一是没有更多信息就无法回答的问题;没有一个正确的方法来初始化每个程序。 – Pops 2010-04-26 16:36:17

回答

1

您应该尽可能快地初始化变量 - 只要初始值已知。取而代之的

ArrayList<String> contactArrayList; 

考虑这个

static final int INITIAL_LIST_SIZE = 100; 
List<String> contactArrayList = new ArrayList<String>(INITIAL_LIST_SIZE); 

下面是类变量,实例变量,或数组元素default values列表。

附录:它通常皱眉重复默认的初始化。在后面的示例中,默认初始化将i设置为零。

勘误:注意在test构造函数,隐藏场修正关于int i = 0评论。

public class test { 

    int i = 0; // superfluous, "int i;" is enough 

    public test() { 
     int i = 0; // hides field i 
    } 

    public void addi() { 
     int i = i + 1; // hides field i; won't increment field i 
    } 
} 
+0

@trashgod越快越好。好的,我可以理解这一点。 ID在顶部定义我的变量并初始化它。但让我说,我不知道它是什么,直到该方法。我将如何写它。我会在顶部创建一个变量,将它从构造函数中取出并放入方法中?一个例子会很棒。 – OVERTONE 2010-04-26 16:50:28

+0

常量INITIAL_LIST_SIZE只是一个最佳估计值。如果没有更好的猜测,你会依赖默认构造函数的值10,'new ArrayList ()'。 http://java.sun.com/javase/6/docs/api/java/util/ArrayList.html – trashgod 2010-04-26 17:00:53

+1

“我将如何写它,我会在顶部创建一个变量,让它离开构造函数,并把它它的方法?“究竟。那么你只需要小心,在初始化之前你永远不会尝试访问变量。正如约翰D所说,这有点不寻常。通常,对象中的所有变量都将在构造函数中初始化,或者仅在“变量部分”中内联,即使它们已初始化为空列表或空映射。 – MatrixFrog 2010-04-26 17:03:02

1

没有初始化事情的唯一问题是你让自己打开空指针异常。理想情况下,您应该在构造函数中初始化您需要的所有内容,以确保其他方法都可以使用。另一种方法是在调用方法之前检查是否为空(例如if (list != null && list.size() > 0)

2

由于不同的原因,变量可以在不同的位置进行初始化。例如,在您的示例代码中,您总是将您的联系人列表初始化为新的JList。这可以在“变量在这里”部分作为private JList contactList = new JList()完成。

您的contactArrayList看起来像通常基于传入构造函数的参数,所以应该在构造函数中将这些项添加到它中。如果你采用这种方法,contactArrayList应该被声明为final。这将强制所有构造函数初始化列表。 (如果你不想最终声明它,你可能想要在声明时使用联系人列表的处理方式初始化它。)

偶尔,字段不能(或不应该)被初始化,直到该类的实例已构建。在这些情况下,您必须非常小心地访问和使用该字段,以确保它未在未初始化状态下使用。

0

你最后一个例子 - “public test(){int i = 0; }“可能不会按预期工作,通过在test和addi中重新声明变量”int“,现在有三个名为”i“的变量:成员变量定义在顶部,局部变量在测试中,另一个局部变量在addi中,成员值不会被任何一个函数改变

我肯定会避免使用虚拟值初始化变量,比如你的“contact1 = new String()”,是的,这可以防止你得到编译错误对于未初始化的变量或者可能抛出一个空指针异常,但是如果没有这个就得到一个错误,那就意味着你没有给变量赋一个实际值,设置这个虚拟值并不能解决问题,它只是隐藏它就像是将磁带放在仪表板上的警告灯上:是的,你再也看不到警告了,但这不是因为问题已修复,只是因为你已经覆盖了它向上。

确实有些情况下可以设置一个默认值,然后也许你会用其他值替换它,也许你不会。我不是说这是一个不好的做法。我在说,如果你得到了单位变量的错误,不要盲目地将它们初始化为无意义的东西。找出为什么他们没有价值并解决真正的问题。

除此之外,我不知道该怎么说你的例子。我不确定你想要完成什么。您有名为contact1,contact2和contact3的变量看起来永远不会使用。 contactArray显然应该由fillContactsGui填充,但我没有看到它曾经被调用过的地方。我不确定这些在你的逻辑中是否有缺陷,或者这只是一个不完整的例子。

至于初始化和使用数据的一般正确的方法:

如果一个变量可以是本地的,使它局部。在这种情况下,理想情况下在声明它时进行初始化。像:

public void foobar() 
{ 
    ... do some stuff ... 
    int i=0; 
    ... do other stuff ... 
    i=i+j; 
    ... etc ... 
} 

我会避免界定它,然后以后如果有可能对其进行初始化,因为这将创建一个你无法初始化它的可能性。当然,如果它可能以两种不同的方式初始化,这是很难避免的。像:

public void foobar() 
{ 
    int i; 
    if (plugh>0) 
    i=plugh; 
    ... bunch more logic ... 
    // Inside some IF so we won't even get here if i was set earlier 
    if (zork==true) 
    i=shambar; 
    ... etc ... 
} 

尽管如此,你可以把它放在一起越好,越好。