Подтвердить что ты не робот

Лучшие практики java с использованием оператора + =

Я читал книгу "Начало Основы Java 8". И я увидел эту строку:

//some code...
sum = sum + i; // Better to use sum += i
//more code...

Тогда вот мои сомнения: это правда? Почему лучше использовать оператор +=? Я думал, что оператор += был только более упрощенным выражением? Если я использую тот или иной эффект, который влияет на производительность кода?

4b9b3361

Ответ 1

Я думаю, книга предлагает использовать += как лучшую практику. Действительно, нет разницы между двумя утверждениями sum += i и sum = sum + i

Я реализую 2 класса, каждый из которых включает один оператор и наблюдаю за байтовым кодом командой javap

Вот программа 1:

public class Program1 {
     public static void main(String []args) {
        int i = 1;
        int sum = 2;
        sum += i;
     }
}

Вот код байта:

public class Program1 {
  public Program1();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: iconst_1
       1: istore_1
       2: iconst_2
       3: istore_2
       4: iload_1
       5: iload_2
       6: iadd
       7: istore_1
       8: return
}

Вот программа 2:

public class Program2 {
    public static void main(String []args) {
        int i = 1;
        int sum = 2;
        sum = sum + i;
    }
}

Вот код байта:

public class Program2 {
  public Program2();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: iconst_1
       1: istore_1
       2: iconst_2
       3: istore_2
       4: iload_1
       5: iload_2
       6: iadd
       7: istore_1
       8: return
}

Как видно выше, байт-коды являются одинаковыми, поэтому утверждения одинаковы. Нет разницы.

Изменить 1: Как запустить команду javap

  • Сохранить Program1.java в java файле
  • Скомпилируйте код. Выполнить javac Program1.java
  • Как Program1, так и Program2 должны успешно компилироваться.
  • Запустите javap -c Program1.class, чтобы увидеть байт-код.

Изменить 2: Разница между операторами, если разные типы переменных

Оператор

+= имеет неявный оператор cast to left, поэтому, если переменные различаются по своим типам += operator wil automaticaly cast.

Вот код

long i = 1;
int sum = 2;
sum += i; //means sum = (int)(i + sum)

Кроме того, sum = sum + i не имеют неявного выражения, этот оператор не будет компилироваться.

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

Ответ 2

Как заметил @Trinimon, существует разница между операторами += и +:

E1 op= E2 эквивалентен E1 = (T) ((E1) op (E2)), где T - тип E1, за исключением того, что E1 оценивается только один раз. (§15.26.2 Операторы присваивания соединений)

Итак,

int sum = 0;
sum += 1.0; // this is equivalent to sum = (int) (sum + 1.0);
sum = sum + 1.0; // this will not compile
                 // incompatible types: possible lossy conversion from double to int

В отличие от здравого смысла, более безопасно не использовать +=.

Хороший вопрос!

Ссылка

Java + =, - =, * =,/= составные операторы присваивания

Ответ 3

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

Можно утверждать, что стиль sum += i; лучше, потому что он не является избыточным, для читателя может потребоваться немного меньше работы, чтобы выяснить, что происходит с +=, потому что нет необходимости искать сумму с обеих сторон оператора присваивания.

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

Использование += в некоторых неясных случаях, связанных с неявным отбрасыванием, может быть проблематичным. Существует головоломка Java (из книги Блоха и Гафтера), которая управляет злоупотреблением этим, см. Этот вопрос.