2016-10-13 5 views
0

Я столкнулся с двумя образцами кода из унаследованной системы, в которых я не понимаю, почему кто-то будет писать код таким образом. Приложение находится на Java и составляет около 10-15 лет.Странные методы кодирования В java

Кажется настолько неэффективным, что трудно понять, как это делается.

if(condition) { 
    String[] hdtTmp = { "Range (Brand):", "Build Region:", "Design:", "Plan (Size):", "Facade:", "Region:" , "Internal Colour", "External Colour"}; 
    hdt = hdtTmp; 

    String[] hddTmp = { p.RangeName, brName, p.HomeName, p.Name, f.Name, "North", "Red", "Blue"};       
    hdd = hddTmp; 

    hddTmp = null; 
    hdtTmp = null; 
} 

Я не понимаю, почему вы не просто присвоили его атрибуту в первую очередь? А так как hdtTmp и hddTmp находятся внутри блока, почему они делают null?

max = hdt.length -1; 

for(int i=0; ; i++) { 
    // do some stuff here 
    if(i == max) 
     break; 
} 

Опять же, кажется, что первоначальный программист не знал, как работать с петлями?

Они никогда не учили этому, когда я делал свою степень, поэтому мой вопрос: зачем кому-то писать такой код?

+0

У меня проблема? Мы могли бы только спекулировать так же хорошо, как вы могли. –

+1

Скорее всего, кто-то просто не очень хорошо знал, что они делают. Если 'hddTmp' - это поток/метод local, то присвоение null не имеет значения. –

ответ

0

Установка локальных переменных на нуль ... Ну, еще в 90-х годах в какой-то старой документации Sun говорилось, что это поможет, но это было так долго и эта информация, вероятно, больше не доступна, поскольку она больше не верна. Я столкнулся с этим в большом количестве старого кода, и в этот момент он ничего не делает, поскольку локальные переменные теряют ссылку на объект, как только метод выходит, и GC достаточно умен, чтобы понять это.

Вопрос, связанный с циклом for(), связан с тем, что кто-то строит цикл с критерием выхода внутри фактического цикла. Это просто неудачный стиль кодирования и, вероятно, написанный относительно младшим разработчиком.

Этот код определенно кажется кому-то, кодирующим java после изучения C/C++. Я видел достаточно этого, люди C/C++ были обучены очистке после выделения, а присвоение нулевому - что-то, что сделало их счастливыми (по крайней мере, те, с которыми я работал в тот же день). Еще одна вещь, которую они сделали, - это переопределить метод finalize, который является плохой формой в java, но был самым близким к деструкторам.

Вы также можете увидеть бесконечные циклы с заходом состояние внутри как:

for (;;) { 
    // Do stuff 
    if (something_happened) 
     break; 
} 

Старые (плохие) привычки умирают с трудом.

0

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

Если код между назначением null и окончанием области переменной (часто конец метода) длительный, то обнуление дает более раннюю возможность GC объекта, на который ранее ссылались.

На первый взгляд это микро оптимизация, но она может иметь преимущества безопасности: если дамп памяти или другой подобный снимок (например, профилировщик) должен был произойти, он мог (очень немного) уменьшить вероятность того, что конфиденциальные данные часть дампа.

Эти «преимущества» довольно слабы.

Код в вопросе, однако, совершенно бесполезен.

+0

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

+0

@dion Я имел в виду общую концепцию обнуления переменных. Однако код в Q бесполезен. – Bohemian

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

  • Нет связанных вопросов^_^