2013-12-04 2 views
1

У меня есть функция java. В первой функции возвращаемая переменная «ret» инициализируется объявлением во второй функции, она инициализируется внутри try при необходимости. Что вы, ребята, думаете, что лучше? Пожалуйста, рассмотрите Список как пример, это может быть строка и тип. СпасибоJava: Локальная инициализация локальной функции

Первая функция:

public List<String> getNames() { 
    List<String> ret = new ArrayList<String>(); 
    try { 
     // use ret 
    } catch(Exception e){ 

    } 
} 

Вторая функция:

public List<String> getNames() { 
    List<String> ret = null; 
    try { 
     // some more code 
     ret = new ArrayList<String>(); 
     // use ret 
    } catch(Exception e){ 

    } 
} 
+1

Не имеет значения. Потому что в конечном итоге оба оператора будут выполняться, и ваша переменная 'ret' будет инициализирована. –

+1

«Преждевременная оптимизация - это корень всех злых дел». Незначительная разница. –

ответ

2

Единственное отличие между ними состоит в том, что если блок try не завершился нормально, в первом случае будет возвращен пустой список. Во втором случае NULL будет возвращен.

Какой подход лучше?

В зависимости от ваших требований.

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

Сказав это, если я предполагаю, что список не будет заполнен элементами за пределами getNames(), тогда пустой список, занимающий память, не является хорошим.

Но, наоборот, если список заполняется элементами за пределами getNames(), скажем, например, в методе вызывающего абонента getNames(), тогда возврат пустого списка также в порядке.

+0

+1 для перспективы памяти. –

+1

@ sᴜʀᴇsʜᴀᴛᴛᴀ спасибо суреш. – RAS

+0

+1 Спасибо, РАН. –

0

Первый лучше, потому что нет никаких шансов, что назначение ret в new ArrayList<String>() потерпит неудачу. Хорошей практикой является ограничение содержимого блока try на операции, которые могут генерировать исключения.

1

Это зависит от вашей цели. Ну, если у вас есть некоторые зависимости или условие, которое должно быть выполнено до создания экземпляра ArrayList, вы можете перейти ко второму варианту. Я бы рекомендовал второй вариант, потому что он мгновенно создает экземпляр, когда это необходимо. Все решение может быть выполнено только тогда, когда мы видим код перед созданием и использованием экземпляра ArrayList. Это оставит List ссылкой как null, если что-либо не удалось до его создания. Мы также можем сделать инициализацию после try catch block а

public List<String> getNames() { 
    List<String> ret = null; 
    try { 
     // code which is prone to exception 
    } catch(Exception e){ 

    } 
    ret = new ArrayList<>(); 
    //set the values in ret and return it 
} 

}

Лучшая практика всегда инициализировать объект только по необходимости.

0

Это действительно зависит от необходимости. В первом методе, если возникает исключение, у вас все еще есть контроль над ret, в последнем вы не делаете.

0

Это зависит от того, что вы делаете. Если вы можете использовать ret как в try, так и в catch, используйте первую форму. Если вы хотите использовать ret в блоке try, поместите деление ret внутри блока try.

public List<String> getNames() { 
    try { 
     // some more code 
     List<String> ret = new ArrayList<String>(); 
     // use ret 
    } catch(Exception e){ 

    } 
} 
0

Это зависит. Если нечего поймать, в частности, операции. Нет смысла ставить это в try-catch.

List<String> ret = new ArrayList<String>(); // here no exception will throw. 
0

Лично я использую первый метод. Я не обязательно вижу преимущество инициализации его в try/catch, хотя технически вы его инициализируете, установив его в null во втором кодовом блоке перед try/catch. Чтобы просто объявить его, используйте List<String> ret;.

2

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

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

0

Мой друг и я принял взглянуть на это и мы считаем, что: инициализация списка RET в примерках улова обеспечит какую-либо ошибку thown будет пойман

Не уверен, если это достаточно для ожидания :)

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