#java #legacy
#java #Наследие
Вопрос:
Я наткнулся на 2 примера кода из устаревшей системы, и я не могу понять, почему кто-то так кодирует. Приложение на Java, и ему около 10-15 лет.
Это кажется настолько неэффективным, что трудно понять, как это делается.
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 находятся внутри блока, зачем делать их нулевыми?
max = hdt.length -1;
for(int i=0; ; i ) {
// do some stuff here
if(i == max)
break;
}
Опять же, кажется, что первоначальный программист не знал, как работают циклы for?
Они никогда не учили этому, когда я получал степень, поэтому мой вопрос в том, зачем кому-то писать такой код?
Комментарии:
1. Есть ли здесь проблема? Мы могли только строить догадки, как и вы.
2. Скорее всего, кто-то просто не очень хорошо знал, что он делает. Если
hddTmp
поток / метод являются локальными, то присвоение null не имеет значения.
Ответ №1:
Установка локальных переменных в значение null… Еще в 90-х годах в какой-то старой документации Sun предполагалось, что это поможет, но прошло так много времени, и эта информация, вероятно, больше не доступна, поскольку она больше не является правильной. Я сталкивался с этим во многих старых кодах, и на данный момент он ничего не делает, поскольку локальные переменные теряют ссылку на объект, как только метод завершается, и GC достаточно умен, чтобы понять это.
Вопрос цикла for () заключается скорее в том, что кто-то создает цикл с критерием выхода внутри фактического цикла. Это просто неудачный стиль кодирования и, вероятно, написан относительно младшим разработчиком.
Этот код определенно выглядит так, как будто кто-то кодирует java после изучения C / C . Я видел достаточно об этом, людей на C / C учили убирать после выделения, и присвоение значения null было тем, что делало их счастливыми (по крайней мере, те, с которыми я работал в свое время).). Еще одна вещь, которую они сделали, это переопределили метод finalize, который является плохим тоном в java, но был самым близким к деструкторам.
Вы также можете увидеть бесконечные циклы с условием остановки внутри, например:
for (;;) {
// Do stuff
if (something_happened)
break;
}
Старые (плохие) привычки умирают с трудом.
Ответ №2:
Существует узкий вариант использования для обнуления переменных в общем случае.
Если код между назначением null
и концом области видимости переменной (часто концом метода) выполняется слишком долго, обнуление дает более раннюю возможность создать объект, на который ранее ссылались.
На первый взгляд это микрооптимизация, но она может иметь преимущества в плане безопасности: если произойдет дамп памяти или другой подобный снимок (например, с помощью профилировщика), это может (очень незначительно) снизить вероятность того, что конфиденциальные данные были частью дампа.
Однако эти «преимущества» довольно незначительны.
Однако код в вопросе совершенно бесполезен.
Комментарии:
1. Кажется, что такая производительность падает, когда вы назначаете локальную временную переменную только для переназначения этой временной переменной на глобальную, а затем обнуляете временную, чтобы ее область действия заканчивалась сразу после этого.
2. @dion я имел в виду общую концепцию обнуления переменных. Однако код в Q совершенно бесполезен.