正确的初始化变量的方法

时间:2010-04-26 16:17:58

标签: java swing initialization constructor

好吧,这只是在黑暗中拍摄,但它可能是我得到的大多数错误的原因。

当你初始化的东西。让我们说一个小摆动程序。它会像这样吗

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];
    }
}

我知道这可能是一个很大的初学者问题,但这也是我已经习惯使用的代码。我初始化三次和四次没有意义因为我不知道他们在哪里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;
  }
}

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

5 个答案:

答案 0 :(得分:2)

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

您的contactArrayList看起来通常基于传递给构造函数的参数,因此应该在构造函数中将项添加到它中。如果您采用这种方法,则应将contactArrayList声明为final。这会强制所有构造函数初始化列表。 (如果您不想将其声明为final,则需要在声明时以与处理contactList相同的方式初始化它。)

有时,在构造类的实例之前,不能(或不应该)初始化字段。在这些情况下,您必须非常小心地访问和使用该字段,以确保它不会在未初始化状态下使用。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

一般情况下,只要知道初始值,就应该尽快初始化变量。而不是

ArrayList<String> contactArrayList;

考虑这个

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

以下是类变量,实例变量或数组组件的default values列表。

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

错误:请注意关于int i = 0构造函数中test的更正评论,隐藏字段 i

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
    }
}

答案 3 :(得分:1)

本教程在Object Initialization in Java上回答了您的许多问题。

您将学习实例变量根据其类型初始化为默认值,何时使用静态初始化器,何时使用构造函数,初始化与继承等等。

以下是其他一些有价值的资源:

答案 4 :(得分:0)

你的最后一个例子 - 带有“public test(){int i = 0;}”的例子可能不会按预期工作。通过在test和addi中重新声明变量“int”,您现在有三个名为“i”的变量:顶部定义的成员变量,test中的局部变量和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 ...
}

尽管如此,你可以将它们保持在一起越多越好。