Это интересно в Javascript. Рассмотрим этот пример:
function changeStuff(a, b, c)
{
a = a * 10;
b.item = "changed";
c = {item: "changed"};
}
var num = 10;
var obj1 = {item: "unchanged"};
var obj2 = {item: "unchanged"};
changeStuff(num, obj1, obj2);
console.log(num);
console.log(obj1.item);
console.log(obj2.item);
Это приводит к выходу:
10
changed
unchanged
obj1.item
не повлияет на obj1
вне функции. num
будет 100
, а obj2.item
будет читать "changed"
. Вместо этого ситуация заключается в том, что переданный элемент передается по значению. Но элемент, который передается по значению, является самой ссылкой. Технически это называется вызовом по обмену .
В практическом плане это означает, что если вы измените сам параметр (как в num
и obj2
), что не повлияет на элемент, который был подан в параметр. Но если вы измените INTERNALS параметра, который будет распространяться обратно (как с obj1
).
1. Неправильно ли использовать устаревшие методы или классы в Java?
blockquote>A Программный элемент, аннотированный @Deprecated, является тем, что программистам не рекомендуется использовать, как правило, потому что это опасно или потому, что существует лучшая альтернатива.
blockquote>Метод хранится в API для обратная совместимость в течение неопределенного периода времени и может быть удалена в будущих выпусках. То есть нет, это не неправильно , но есть лучший способ сделать это, что более устойчиво против изменений API.
2. Что делать, если я не изменяю какой-либо метод и не запускаю мое приложение с предупреждениями, которые у меня есть, создаст ли он какую-либо проблему с производительностью.
blockquote>Скорее всего нет. Он будет по-прежнему работать по-прежнему без устали. Контракт метода API не изменится. Если какая-то внутренняя структура данных изменяется в пользу нового лучшего метода, это может повлиять на производительность, но это маловероятно.
Самое смешное изъявление в Java API - это imo,
FontMetrics.getMaxDecent
. Причина для устаревания: ошибка орфографии.Устарело. Начиная с версии 1.1.1 JDK, заменяется на getMaxDescent ().
blockquote>
Вы все равно можете использовать устаревший код без изменения производительности, но вся точка устаревания метода / класса заключается в том, чтобы сообщить пользователям, что теперь есть лучший способ его использования, и что в будущей версии устаревший код, скорее всего, удаляться.
Да, это неправильно.
Устаревшие методы или классы будут удалены в будущих версиях Java и не должны использоваться. В каждом случае должна быть доступна альтернатива. Используйте это.
Есть несколько случаев, когда вам нужно использовать устаревший класс или метод для достижения цели проекта. В этом случае у вас действительно нет выбора, кроме как использовать его. Будущие версии Java могут нарушить этот код, но если это требование, вам нужно жить с этим. Вероятно, это не первый случай, когда вам нужно было сделать что-то не так, чтобы соответствовать требованиям проекта, и это, конечно, не будет последним.
При обновлении до новой версии Java или некоторых другая библиотека, иногда метод или класс, который вы использовали, устаревают. Устаревшие методы не поддерживаются, но не должны давать неожиданных результатов. Это не значит, что они не будут, тем не менее, переключать ваш код как можно скорее.
Процесс устаревания заключается в том, чтобы у авторов было достаточно времени, чтобы изменить свой код с старого API на новый API. Используйте это время. Измените свой код на ASAP.
Это не так, это просто не рекомендуется. Обычно это означает, что на данный момент есть лучший способ сделать что-то, и вы добьетесь успеха, если будете использовать новый улучшенный способ. Некоторые устаревшие вещи действительно опасны и их следует избегать вообще. Новый способ может обеспечить лучшую производительность, чем устаревший, но это не всегда так.
Неправильно ли использовать устаревшие методы или классы в Java?
Предположим, что существует уязвимость безопасности, связанная с методом, и разработчики считают, что это ошибка дизайна. Поэтому они могут решить отказаться от метода и ввести новый способ.
Итак, если вы все еще используете старый метод, у вас есть угроза. Поэтому имейте в виду причину устаревания и проверьте, как это влияет на вас.
что если не изменить какой-либо метод и запустить мое приложение с предупреждениями, которые у меня есть, создаст ли он какую-либо проблему с производительностью.
Если из-за проблемы с производительностью из-за проблемы с выпуском, у вас будет проблема с производительностью, иначе нет причин для возникновения такой проблемы. Опять же хотелось бы отметить, помните о причине устаревания.
Из официального глоссария Sun:
deprecation: указывает на класс, интерфейс, конструктор, метод или поле, которое больше не рекомендуется, и может прекратиться существовать в будущей версии.
blockquote>Из руководства how-and-when to deprecate:
Возможно, вы слышали термин «самоуничижительный юмор» или юмор, который сводит к минимуму важность докладчика. Устаревший класс или метод подобны этому. Это уже не важно. На самом деле так важно, что вы больше не должны его использовать, поскольку он был заменен и может перестать существовать в будущем.
blockquote>Аннотации
@Deprecated
пошли дальше и предупреждать об опасности:Программный элемент, аннотированный
blockquote>@Deprecated
, является тем, что программистам не рекомендуется использовать, как правило, потому что это опасно или потому, что существует лучшая альтернатива .Ссылки
- java.sun.com Глоссарий
- Языковой справочник / Как и когда отказаться от API
- Тип аннотации Устаревший API
Правильно или неправильно?
Вопрос о том, правильно или неправильно использовать устаревшие методы, должен быть рассмотрен на индивидуальной основе. Вот ВСЕ кавычки, в которых слово «устарело» появляется в Эффективное Java 2nd Edition :
Пункт 7: Избегайте финализаторов: только методы, которые утверждают, что гарантируют завершение, -
System.runFinalizersOnExit
и его злой близнецRuntime.runFinalizersOnExit
.Пункт 66: Синхронизация доступа к общим изменяемым данным: библиотеки предоставляют метод
Thread.stop
, но этот метод давно устарел, поскольку он по своей сути небезопасен - его использование может привести к повреждению данных.Пункт 70: Безопасность потока документа: метод
System.runFinalizersOnExit
является нить-враждебным и устарел.Пункт 73: Избегайте групп потоков: они позволяют применять некоторые примитивы
blockquote>Thread
к кучке потоков одновременно. Некоторые из этих примитивов устарели, а остальные редко используются. [...] группы потоков устарели.Итак, по крайней мере, со всеми вышеперечисленными методами, очевидно, неправильно использовать их, по крайней мере, согласно Джошу Блоху.
С помощью других методов вам нужно будет рассматривать проблемы индивидуально и понимать, ПОЧЕМУ они были устаревшими, но, вообще говоря, когда решение об осуждении оправдано, оно будет склоняться к неправильному праву, чтобы продолжать использовать их.
Связанные вопросы
Я чувствую, что устаревший метод означает; существует альтернативный метод ive, который лучше во всех аспектах, чем существующий метод. Лучше использовать хороший метод, чем существующий старый метод. Для обратной совместимости старые методы остаются устаревшими.
deprecated
, если у вас есть хороший план на случай непредвиденных обстоятельств, чтобы избежать каких-либо проблем, если / когда эти методы исчезнут из библиотеки, которую вы используете. С самим Java API это никогда не происходит, но с чем-либо еще это означает, что он будет удален. Если вы специально планируете не обновлять (, хотя, скорее всего, вам понадобится ) поддерживающие библиотеки вашего программного обеспечения, тогда нет проблем с использованием методов deprecated
. Неправильно ли использовать устаревшие методы или классы в Java? "
blockquote>Неправильно как таковое, но это может сэкономить вам некоторую проблему. Вот пример, где он сильно обескуражен использовать устаревший метод:
http://java.sun.com/j2se/1.4.2/docs/guide/misc/threadPrimitiveDeprecation.html
< blockquote>Почему Thread.stop устарел?
Поскольку он по своей сути небезопасен. Остановка потока заставляет его разблокировать все мониторы, которые он заблокировал. (Мониторы разблокируются по мере распространения исключения ThreadDeath если какой-либо из объектов, ранее защищенных этими мониторами, находился в несогласованном состоянии, другие потоки могут теперь просматривать эти объекты в несогласованном состоянии. Такие объекты, как говорят, повреждены. Когда потоки работают на поврежденных объектах, произвольное поведение Это может быть тонким и трудным для обнаружения, или это может быть выражено. В отличие от других исключенных исключений ThreadDeath убивает потоки молча, , пользователь не предупреждает, что его программа может быть повреждена.
blockquote>
Что произойдет, если не изменить какой-либо метод и запустить мой приложение с предупреждениями, которые у меня есть, приведет к возникновению любой проблемы с производительностью.
blockquote>Не должно быть проблем с точки зрения производительности. Стандартный API разработан с учетом некоторой обратной совместимости, поэтому приложения могут постепенно адаптироваться к более новым версиям Java.
В Java это @Deprecated, в C # это [Устаревшее].
Я думаю, что предпочитаю терминологию C #. Это просто означает, что он устарел. Вы можете использовать его, если хотите, но, вероятно, лучший способ.
Это похоже на использование Windows 3.1 вместо Windows 7, если вы считаете, что Windows 3.1 устарела. Вы все еще можете использовать его, но в будущей версии, вероятно, есть лучшие функции, плюс будущие версии, вероятно, будут поддерживаться - устаревшего не будет.
То же самое для @Deprecated Java - вы все равно можете использовать метод, но на свой страх и риск - в будущем он может иметь лучшие альтернативы и может даже не поддерживаться.
Если вы используете устаревший код, обычно это нормально, если вы не используете не нужно обновлять до более нового API - устаревший код может там не существовать. Я предлагаю, если вы увидите что-то, использующее устаревший код, для обновления, чтобы использовать более новые альтернативы (обычно это указывается в аннотации или в устаревшем комментарии Javadoc).
Редактировать: И как указано Майкл, если причина для устаревания связана с недостатком функциональности (или потому, что функциональность даже не существует), то, очевидно, не следует использовать устаревший код.
Возможно, вы слышали термин «самоуничижительный юмор». Это юмор, который минимизирует вашу важность. Устаревший класс или метод подобны этому. Это уже не важно. На самом деле так важно, что его больше нельзя использовать вообще, поскольку оно, вероятно, перестанет существовать в будущем.
Попытайтесь избежать этого
Это, конечно же, не создает проблемы с производительностью. В противном случае устаревшее средство скорее всего не будет частью функции библиотеки, поэтому вам следует избегать использования ее в новом коде и изменить свой старый код, чтобы прекратить использование он, поэтому вы не сталкиваетесь с проблемами в один прекрасный день, когда обновляете стойки и обнаруживаете, что функция больше не присутствует
It certainly doesn't create a performance issue
; его слишком субъективно заявить, что.
– KMån
31 May 2010 в 08:44
Это не так, но некоторые из устаревших методов удаляются в будущих версиях программного обеспечения, поэтому вы, возможно, закончите работать с неработающим кодом.
Помимо всех превосходных ответов выше, я обнаружил, что есть еще одна причина, чтобы удалить устаревшие вызовы API.
Изучать, почему вызов устарел. Я часто нахожу, что изучаю интересные вещи о Java / API / Рамочной основы. Часто существует веская причина, почему метод устаревает, и понимание этих причин приводит к более глубокому пониманию.
Итак, с точки зрения обучения / роста, это также стоит усилий
Конечно, нет - поскольку вся Java получает @Deprecated :-), вы можете свободно использовать их до тех пор, пока Java длится. Не собираюсь замечать каких-либо различий, если только это не сломано. Значение - нужно прочитать об этом, а затем решить.
В .Net однако, когда что-то объявлено [Устаревшим], немедленно идите об этом, даже если вы никогда не использовали его раньше - у вас есть около 50% шанс, что он более эффективен и / или проще в использовании, чем замена: -))
. В общем, в наши дни может быть очень полезно быть техноконсервативным, но сначала вам нужно заниматься чтением .