2015-03-18 2 views
0

В то время как я читаю пружинный учебник, я нашел что-то вроде этого:Java: метод для создания экземпляра объекта

LocalChangeInterceptor localChangeInterceptor; 
localChangeInterceptor = new LocalChangeInterceptor(); 

Так что есть разница с таким образом?

LocalChangeInterceptor localChangeInterceptor = new LocalChangeInterceptor(); 

Кроме того, я хочу знать, почему люди предпочитают

if (String.class.equals(sourceType.getType()))  

в

if (sourceType.getType().equals(String.class)) 

ответ

2
  1. LocalChangeInterceptor localChangeInterceptor = new LocalChangeInterceptor();

    является эффективно же, как

    LocalChangeInterceptor localChangeInterceptor; 
    localChangeInterceptor = new LocalChangeInterceptor(); 
    

    Но иногда нужно разделить задание, чтобы расширить сферу в виде ссылки. Например, при открытии базы данных Connection вы разделили бы объявление так, чтобы ссылка connection была доступна в блоке finally.

    Connection connection; 
    try { 
        connection = DriverManager.getConnection(...); 
        // Do statement stuff that may throw exceptions 
    } catch (SQLException e) { 
        // Handle exception 
    } finally { 
        // Close connection 
        if (connection != null) { // Available inside finally, 
         connection.close(); // because declared outside the try block 
        } 
    } 
    
  2. С

    if (String.class.equals(sourceType.getType())) 
    

    вам избежать NullPointerExcpetion если таковые getType() возвращается null.

    Это потому, что, когда вы щелкаете код для

    if (sourceType.getType().equals(String.class)) { 
    

    в выполнения он пытается выполнить

    if (**null**.equals(String.class)) { // NPE! 
    
+0

Может быть, объясните, как избежать NullPointerException - потому что String.class всегда существует, а equals() может использоваться на null. – Schaka

2

В этом:

LocalChangeInterceptor localChangeInterceptor; 
localChangeInterceptor = new LocalChangeInterceptor(); 

что вы делаете это вы первый создать ссылку до LocalChangeInterceptor, а затем создать новый объект во второй строке и передать его ссылку на вашу переменную.

Во втором случае вы делаете то же самое, но в один шаг. Вы создаете ссылку и сразу же передаете ей значение.

LocalChangeInterceptor localChangeInterceptor = new LocalChangeInterceptor(); 

Это: if (String.class.equals(sourceType.getType())) То же самое с: if (sourceType.getType().equals(String.class))

Кроме того, я хочу дать вам один совет. Stackoverflow не подходит для обучения программированию. Этот вопрос, например. Вы могли бы ответить на него самостоятельно, если бы искали немного больше. I настоятельно рекомендую, чтобы вы приложили к этому дополнительные усилия. Обучение программированию - непростая задача.

Удачи.

+0

Я выбрал ответ, который мне нужен, и я уверен, что вы поймете, что я должен знать из этого вопроса. хотя, спасибо за ваш ответ. Иногда я просто хочу знать, почему, а не как. –

1

Предыдущий ответ от @TheCrafter отвечает на часть вашего вопроса.

Однако, почему люди предпочитают

if (String.class.equals(sourceType.getType()))  

в

if (sourceType.getType().equals(String.class)) 

если потому, что второй вариант может бросить NullPointerException.

Лучше всего назвать метод equals по известному постоянному значению, которое никогда не может быть null. String.class выполняет это.

0

Для вашего первого вопроса, единственное различие заключается в том, что в переменная инициализируется после ее объявления. Это полезно в некоторых случаях, когда переменная не будет использоваться некоторое время, поэтому не нужно содержать какие-либо данные до их использования. Посмотрите на ленивую инициализацию.

Для второго, идея для предотвращения NullPointerException. Если sourceType.getType() вернулся null, ваш второй пример будет бросать NPE, , так как мы пытаемся вызвать equals из переменной, которая ссылается на нуль. Но в первом примере мы вызываем equals что-то, что мы ЗНАЕМ, не будет null. Если в первом примере sourceType.getType() был пустым, equals просто вернул бы false вместо NPE. Передача null в метод Equals вернет ложное

0

Поскольку sourceType.getType() может возвращать нуль и String.class всегда возвращают class java.lang.String.
Итак? Что случилось с пустым?
Ну, если перевести его после того, как результат возвращается нулевое значение, вы можете прочитать следующий код
if (sourceType.getType().equals(String.class))
стать как этот
if (null.equals(String.class))
и ваш код будет иметь закончился NullPointerException ошибку.

0

Функциональной разницы между этими двумя утверждениями нет.

LocalChangeInterceptor localChangeInterceptor = new LocalChangeInterceptor(); 

LocalChangeInterceptor localChangeInterceptor; 
localChangeInterceptor = new LocalChangeInterceptor(); 

Выбор между ними в основном стилистическим, и обычно только делает разницу, если вы пытаетесь предотвратить слишком длинные строки.


Существует тонкая, но важная разница между различными проверками равенства.

String.class.equals(sourceType.getType())` 

`sourceType.getType().equals(String.class)` 

Веди очень по-разному в одном важном случае, но (как уже упоминалось TheCrafter), вы должны быть в состоянии выяснить, по своему усмотрению, с немного усилий.

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

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