2010-04-26 5 views
1

ОК это просто выстрел в темноте, но это может быть причиной большинства ошибок, которые я получил.Правильный способ инициализации переменных

, когда вы что-то инициализируете. скажем, программа swal swing. будет ли идти как этот

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

я знаю, что это, вероятно, огромный начинающий вопрос, но это код ив привыкло тоже. im, инициализируя thigns три и четыре раза без смысла, потому что im не уверен, где они 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; 
    } 
} 

им пытаются выяснить, как правильно инициализировать переменные. потому что им определяя их каждый раз, когда я их использую

+0

Ваш вопрос не очень ясен для меня. Какие сообщения об ошибках вы получаете? – CoolBeans

+0

Это то, что у вас есть для кода или просто фрагмента? Трудно понять, что делает ваш код на самом деле, и поэтому нам сложно помочь вам. –

+0

Вы спрашиваете, «будет ли это так», в отличие от другого, или вообще вообще? Если только в целом, это один из тех вопросов, на которые нельзя ответить без дополнительной информации; нет единого правильного способа инициализации каждой программы. – Pops

ответ

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 конструктору, скрывающей полю я.

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

+0

Константа INITIAL_LIST_SIZE - лучшая оценка. Отсутствие лучшего предположения, вы полагались бы на значение конструктора по умолчанию 10, 'new ArrayList ()'. http://java.sun.com/javase/6/docs/api/java/util/ArrayList.html – trashgod

+1

«Как бы я его написал? Я бы создал переменную наверху, оставьте ее вне конструктора и поставьте это в методе? " В точку. Тогда вам просто нужно быть осторожным, чтобы вы никогда не пытались получить доступ к переменной до ее инициализации. Как сказал Джон Д., это несколько необычно. Как правило, все переменные в объекте будут инициализированы в конструкторе или просто встроены в «раздел переменных», даже если они инициализированы пустым списком или пустой картой. – MatrixFrog

1

Единственная проблема с не инициализирующими вещами заключается в том, что вы оставляете себя открытыми для исключений с помощью исключающего указателя. в идеале вы должны инициализировать все, что вам нужно в своем конструкторе, поэтому вы можете быть уверены, что с любым другим методом есть с чем работать. альтернативой является проверка того, являются ли вещи нулевыми до вызова методов на них (например, if (list != null && list.size() > 0))

2

Переменные могут быть инициализированы в разных местах по разным причинам. Например, в вашем примере кода вы всегда инициализируете свой список контактов новым JList. Это можно сделать в разделе «переменные здесь» как private JList contactList = new JList().

Ваш контактArrayList выглядит так, как будто он основывается на параметрах, переданных в конструктор, поэтому элементы должны быть добавлены к нему в конструкторе. Если бы вы использовали этот подход, contactArrayList должен быть объявлен окончательным. Это заставит всех конструкторов инициализировать список. (Если вы не хотели объявлять его окончательным, вы хотели бы инициализировать его во время объявления так же, как обрабатывался контактный список.)

Иногда поле не может (или не должно) быть инициализировано до тех пор, пока экземпляр класса был построен. В этих случаях вы должны быть очень осторожны в том, как вы получаете доступ и используете поле, чтобы убедиться, что оно не используется в неинициализированном состоянии.

1

Многие из ваших вопросов отвечают в этом уроке на Object Initialization in Java.

Вы узнаете переменные экземпляра инициализируются значениями по умолчанию в зависимости от их типа, когда использовать статические инициализаторы, когда использовать конструктор, инициализация в отношении наследования и т.д.

Вот некоторые другие достойные ресурсы :

0

Ваш последний пример - тот, у кого есть «public test() {int i = 0; } «вероятно, не будет работать так, как предполагалось. Обновляя переменную« int »в test и addi, теперь у вас есть три переменные с именем« i »: переменная-член, определенная сверху, локальная переменная в тесте и другая локальная переменная в добавлении. Значение элемента не изменяется ни одной из функций.

Я бы определенно избегал инициализации переменных с фиктивными значениями, например, ваш «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 ... 
} 

Тем не менее, чем больше вы можете держать это вместе, тем лучше.

Смежные вопросы