2013-12-14 2 views
3

Я только что натолкнулся на некоторый код, который немного странный, мне было интересно, может ли кто-нибудь пролить свет на то, почему это может быть написано так.Странный стиль кодирования Java - почему?

I думаю имеет какое-то отношение к параллелизму - чтобы переменные не могли быть изменены, если другой поток обратился к нему (поскольку обновления переменных не являются атомарными). Или это скорость (потому что локальные переменные быстрее, чем переменные уровня класса?) ИЛИ Я так на все, что я написал здесь :)

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

public Class Space 
{ 
    private double m_dWidth = 0; 

    // Constructors & other methods omitted for readability 
    //... 

    public double getWidth() 
    { 
    double dWidth = m_dWidth; 
    return dWidth; 
    } 
} 
+7

Это как-то связано с тем, что тот, кто написал этот код, не должен писать код вообще, потому что он служит абсолютно бесполезным. –

+2

Я вижу хорошо заданный вопрос. Я не понимаю downvotes (особенно когда downvoter не оставляет комментарий). – Maroun

+2

Это абсолютно бесполезно, и любой хороший компилятор оптимизирует его. – dtech

ответ

3

Похоже, что человек, пишущий код неправильно понял хау return работы. Это распространенное недоразумение среди моих студентов java (первый год университета), что return работает только с локально определенными переменными вместо произвольных выражений.

Как предлагает @Steve, это может быть похмелье из более старой и более сложной версии кода. Какой из них, скорее всего, зависит от того, где вы нашли код.

0

Это не имеет ничего общего с тем, что вы написали. Подумайте об этом куске коды:

class MyClass { 
    private int myInt; 

    //... 

    public int getData() { 
     return myInt; 
    } 

    public int strangeGetData() { 
     int temp = myInt; 
     return temp; 
    } 

    public int strangeGetData2() { 
     int temp = myInt; 
     int temp2 = temp; 
     int temp3 = temp2; 
     return temp3; 
    } 
} 

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

Советуем вам пройти через tutorial, чтобы лучше понять это.

+0

Спасибо, я также не знаю, почему downvotes. Возможно, это потому, что они считают, что они лучше меня? Странно, что для сайта Q & A я получаю downvoted, задавая идеальный вопрос. Хммм. Aaaanyway ... Вы правы, это часть более сложного кода BUT, предположим, что это должно использоваться в многопоточной среде. Может ли быть так, что * if * другой поток изменил m_dWidth точно в то же время, что и возврат, который присваивает его локальной переменной, локальная (старая) копия все равно будет возвращена? – user114381

+0

@ user114381 Нет. Когда у вас есть * многопоточное приложение, вы имеете дело с ним по-другому. Обратитесь к [документам] (http://docs.oracle.com/javase/tutorial/essential/concurrency/), чтобы лучше понять это. – Maroun

+0

Отличная деталь. Большое спасибо. Хорошего дня. – user114381

0

Это должно быть написано без локальной переменной. Локальная переменная в getter бесполезна.

public double getWidth() 
    { 
    return m_dWidth; 
    } 
2

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

  • если m_dWidth является летучим или даже окончательным и использовать его более чем один раз в метод, принимая локальную копию, может повысить производительность (с риском отсутствующих обновлений, которые могут быть приемлемы) - example in ArrayBlockingQueue#extract:

    final Object[] items = this.items; 
    
  • в сома е сложные параллельные конструкции, such as String#hashcode, где взять локальную копию общего, энергонезависимую, переменной необходимо обеспечить корректность в многопоточном контексте:

    int h = hash; 
    

В конкретном примере, вы даете, это ДАЕТ НИКАКИХ разницу (кроме излишне загромождения кода).

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