Графики 6.1 p: редактор или p: textEditor [duplicate]

Это интересно в 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).

140
задан aioobe 21 August 2010 в 21:54
поделиться

15 ответов

1. Неправильно ли использовать устаревшие методы или классы в Java?

Из определение устаревшего :

A Программный элемент, аннотированный @Deprecated, является тем, что программистам не рекомендуется использовать, как правило, потому что это опасно или потому, что существует лучшая альтернатива.

Метод хранится в API для обратная совместимость в течение неопределенного периода времени и может быть удалена в будущих выпусках. То есть нет, это не неправильно , но есть лучший способ сделать это, что более устойчиво против изменений API.

2. Что делать, если я не изменяю какой-либо метод и не запускаю мое приложение с предупреждениями, которые у меня есть, создаст ли он какую-либо проблему с производительностью.

Скорее всего нет. Он будет по-прежнему работать по-прежнему без устали. Контракт метода API не изменится. Если какая-то внутренняя структура данных изменяется в пользу нового лучшего метода, это может повлиять на производительность, но это маловероятно.


Самое смешное изъявление в Java API - это imo, FontMetrics.getMaxDecent . Причина для устаревания: ошибка орфографии.

Устарело. Начиная с версии 1.1.1 JDK, заменяется на getMaxDescent ().

248
ответ дан 12 revs, 2 users 98% 23 August 2018 в 01:19
поделиться
  • 1
    Следующее смешное обесценивание в Java API было бы установлено MultiClick Threshhold (int threshold) и getMultiClickTreshhold () в AbstractButton (Swing). Приготовьтесь к этим двум! ;) – JavaTechnical 9 July 2013 в 18:25
  • 2
    Мы должны сделать это с помощью HTTP REFERER. Это безумие: ru.wikipedia.org/wiki/HTTP_referer – kmiklas 19 January 2017 в 01:21
  • 3
    @DaveMcClelland, сделал его 70 из 69: D;) – VedX 21 April 2017 в 08:35

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

27
ответ дан abyx 23 August 2018 в 01:19
поделиться
  • 1
    Как вы можете быть уверены, что это без изменений в производительности? Например, лишение могло быть связано с изменением внутренней структуры данных, например, от HashSet до TreeSet. – aioobe 21 August 2010 в 21:51
  • 2
    @aioobe. Насколько я понимаю, ОП задал вопрос о том, имеет ли вызывающий устаревший код какие-либо проблемы с производительностью, что не дает того, чтобы он не менял полученный байт-код (до 1.5 был в javadoc, теперь аннотация используется, но до сих пор нет изменений в производительности) – abyx 21 August 2010 в 22:09
  • 3
    При переходе от одной версии библиотеки к другой, нет гарантии, что байт-код метода в новой версии идентичен байтовому коду того же метода в предыдущей версии. – aioobe 21 August 2010 в 22:40
  • 4
    @aioobe - есть гарантия, что просто сделать его устаревшим не изменит байтовый код, что, как мне кажется, означает OP. Конечно, сам код меняется, поэтому мы осуждаем код. – abyx 22 August 2010 в 06:08
  • 5
    Если вы продолжаете использовать ту же версию, что и раньше, изменений нет. Но если вы используете более новую версию библиотеки и не устарели API, то это может быть изменение производительности, если базовая реализация сильно изменена, и новый API использует ее, в то время как более старый API не такой, как как это было раньше, против этой более новой структуры. – gregturn 5 October 2017 в 15:52

Да, это неправильно.

Устаревшие методы или классы будут удалены в будущих версиях Java и не должны использоваться. В каждом случае должна быть доступна альтернатива. Используйте это.

Есть несколько случаев, когда вам нужно использовать устаревший класс или метод для достижения цели проекта. В этом случае у вас действительно нет выбора, кроме как использовать его. Будущие версии Java могут нарушить этот код, но если это требование, вам нужно жить с этим. Вероятно, это не первый случай, когда вам нужно было сделать что-то не так, чтобы соответствовать требованиям проекта, и это, конечно, не будет последним.

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

Процесс устаревания заключается в том, чтобы у авторов было достаточно времени, чтобы изменить свой код с старого API на новый API. Используйте это время. Измените свой код на ASAP.

3
ответ дан Benjamin 23 August 2018 в 01:19
поделиться

Это не так, это просто не рекомендуется. Обычно это означает, что на данный момент есть лучший способ сделать что-то, и вы добьетесь успеха, если будете использовать новый улучшенный способ. Некоторые устаревшие вещи действительно опасны и их следует избегать вообще. Новый способ может обеспечить лучшую производительность, чем устаревший, но это не всегда так.

7
ответ дан Bozhidar Batsov 23 August 2018 в 01:19
поделиться

Неправильно ли использовать устаревшие методы или классы в Java?

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

Итак, если вы все еще используете старый метод, у вас есть угроза. Поэтому имейте в виду причину устаревания и проверьте, как это влияет на вас.

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

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

2
ответ дан Chathuranga Chandrasekara 23 August 2018 в 01:19
поделиться

Терминология

Из официального глоссария Sun:

deprecation: указывает на класс, интерфейс, конструктор, метод или поле, которое больше не рекомендуется, и может прекратиться существовать в будущей версии.

Из руководства how-and-when to deprecate:

Возможно, вы слышали термин «самоуничижительный юмор» или юмор, который сводит к минимуму важность докладчика. Устаревший класс или метод подобны этому. Это уже не важно. На самом деле так важно, что вы больше не должны его использовать, поскольку он был заменен и может перестать существовать в будущем.

Аннотации @Deprecated пошли дальше и предупреждать об опасности:

Программный элемент, аннотированный @Deprecated, является тем, что программистам не рекомендуется использовать, как правило, потому что это опасно или потому, что существует лучшая альтернатива .

Ссылки


Правильно или неправильно?

Вопрос о том, правильно или неправильно использовать устаревшие методы, должен быть рассмотрен на индивидуальной основе. Вот ВСЕ кавычки, в которых слово «устарело» появляется в Эффективное Java 2nd Edition :

Пункт 7: Избегайте финализаторов: только методы, которые утверждают, что гарантируют завершение, - System.runFinalizersOnExit и его злой близнец Runtime.runFinalizersOnExit.

Пункт 66: Синхронизация доступа к общим изменяемым данным: библиотеки предоставляют метод Thread.stop, но этот метод давно устарел, поскольку он по своей сути небезопасен - его использование может привести к повреждению данных.

Пункт 70: Безопасность потока документа: метод System.runFinalizersOnExit является нить-враждебным и устарел.

Пункт 73: Избегайте групп потоков: они позволяют применять некоторые примитивы Thread к кучке потоков одновременно. Некоторые из этих примитивов устарели, а остальные редко используются. [...] группы потоков устарели.

Итак, по крайней мере, со всеми вышеперечисленными методами, очевидно, неправильно использовать их, по крайней мере, согласно Джошу Блоху.

С помощью других методов вам нужно будет рассматривать проблемы индивидуально и понимать, ПОЧЕМУ они были устаревшими, но, вообще говоря, когда решение об осуждении оправдано, оно будет склоняться к неправильному праву, чтобы продолжать использовать их.

Связанные вопросы

19
ответ дан Community 23 August 2018 в 01:19
поделиться
  • 1
    & Quot; Устаревшее & Quot; от латинского "de" + "preare" означает «молиться против». Когда что-то описано как устаревшее, Стандарт молится - попрошайничество - вы не должны его использовать; это предупреждение, что оно может быть удалено в будущей версии этого Стандарта. Обратите внимание, что устаревшая функция требуется для полной реализации в любой реализации текущей версии этого Стандарта. Однако ваше упоминание о самоуничижительном юморе слегка не соответствует значению; & Quot; самоуничижительной & Quot; в этом смысле является коррупцией «самооценки», которая имеет различный вывод и значение. – dajames 9 February 2017 в 09:24

Я чувствую, что устаревший метод означает; существует альтернативный метод ive, который лучше во всех аспектах, чем существующий метод. Лучше использовать хороший метод, чем существующий старый метод. Для обратной совместимости старые методы остаются устаревшими.

0
ответ дан David Glickman 23 August 2018 в 01:19
поделиться
  1. Как правило, нет, это не совсем неправильно использовать методы deprecated, если у вас есть хороший план на случай непредвиденных обстоятельств, чтобы избежать каких-либо проблем, если / когда эти методы исчезнут из библиотеки, которую вы используете. С самим Java API это никогда не происходит, но с чем-либо еще это означает, что он будет удален. Если вы специально планируете не обновлять (, хотя, скорее всего, вам понадобится ) поддерживающие библиотеки вашего программного обеспечения, тогда нет проблем с использованием методов deprecated.
  2. No.
4
ответ дан Esko 23 August 2018 в 01:19
поделиться

Неправильно ли использовать устаревшие методы или классы в Java? "

Неправильно как таковое, но это может сэкономить вам некоторую проблему. Вот пример, где он сильно обескуражен использовать устаревший метод:

http://java.sun.com/j2se/1.4.2/docs/guide/misc/threadPrimitiveDeprecation.html

< blockquote>

Почему Thread.stop устарел?

Поскольку он по своей сути небезопасен. Остановка потока заставляет его разблокировать все мониторы, которые он заблокировал. (Мониторы разблокируются по мере распространения исключения ThreadDeath если какой-либо из объектов, ранее защищенных этими мониторами, находился в несогласованном состоянии, другие потоки могут теперь просматривать эти объекты в несогласованном состоянии. Такие объекты, как говорят, повреждены. Когда потоки работают на поврежденных объектах, произвольное поведение Это может быть тонким и трудным для обнаружения, или это может быть выражено. В отличие от других исключенных исключений ThreadDeath убивает потоки молча, , пользователь не предупреждает, что его программа может быть повреждена.


Что произойдет, если не изменить какой-либо метод и запустить мой приложение с предупреждениями, которые у меня есть, приведет к возникновению любой проблемы с производительностью.

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

2
ответ дан James P. 23 August 2018 в 01:19
поделиться

В Java это @Deprecated, в C # это [Устаревшее].

Я думаю, что предпочитаю терминологию C #. Это просто означает, что он устарел. Вы можете использовать его, если хотите, но, вероятно, лучший способ.

Это похоже на использование Windows 3.1 вместо Windows 7, если вы считаете, что Windows 3.1 устарела. Вы все еще можете использовать его, но в будущей версии, вероятно, есть лучшие функции, плюс будущие версии, вероятно, будут поддерживаться - устаревшего не будет.

То же самое для @Deprecated Java - вы все равно можете использовать метод, но на свой страх и риск - в будущем он может иметь лучшие альтернативы и может даже не поддерживаться.

Если вы используете устаревший код, обычно это нормально, если вы не используете не нужно обновлять до более нового API - устаревший код может там не существовать. Я предлагаю, если вы увидите что-то, использующее устаревший код, для обновления, чтобы использовать более новые альтернативы (обычно это указывается в аннотации или в устаревшем комментарии Javadoc).

Редактировать: И как указано Майкл, если причина для устаревания связана с недостатком функциональности (или потому, что функциональность даже не существует), то, очевидно, не следует использовать устаревший код.

1
ответ дан jamiebarrow 23 August 2018 в 01:19
поделиться
  • 1
    «Если вы используете устаревший код, это нормально, если вам не нужно обновляться до более нового API». - не совсем. Посмотрите, почему Thread.stop () устарел, и вы увидите, что это не нормально, в любой версии JRE. – Michael 27 August 2010 в 10:52
  • 2
    Хорошо, я должен сказать «обычно». fine (обновит этот бит) :) Следовательно, используйте на свой страх и риск. Очевидно, что если причина для обесценивания заключается в том, чтобы остановить недостаток в его функциональности, имеет смысл не использовать его. В целом, однако, использовать устаревший метод. Так что, все зависит от причины устаревания. Правда. – jamiebarrow 30 August 2010 в 11:22

Возможно, вы слышали термин «самоуничижительный юмор». Это юмор, который минимизирует вашу важность. Устаревший класс или метод подобны этому. Это уже не важно. На самом деле так важно, что его больше нельзя использовать вообще, поскольку оно, вероятно, перестанет существовать в будущем.

Попытайтесь избежать этого

8
ответ дан Jigar Joshi 23 August 2018 в 01:19
поделиться

Это, конечно же, не создает проблемы с производительностью. В противном случае устаревшее средство скорее всего не будет частью функции библиотеки, поэтому вам следует избегать использования ее в новом коде и изменить свой старый код, чтобы прекратить использование он, поэтому вы не сталкиваетесь с проблемами в один прекрасный день, когда обновляете стойки и обнаруживаете, что функция больше не присутствует

10
ответ дан Michael Mrozek 23 August 2018 в 01:19
поделиться
  • 1
    Судя по опыту, "устаревшие" действительно означает, что «вы не должны использовать это больше, но он будет доступен навсегда и всегда». По крайней мере, для Java Standard API я не знаю ни одного метода или класса, когда-либо удаляемого после устаревания. – Michael Borgwardt 31 May 2010 в 08:13
  • 2
    @Michael. На практике API редко удаляют устаревшие функции, потому что они могут быть устаревшими в течение десяти лет, когда компиляторы выводят «ПРЕДУПРЕЖДЕНИЕ: ОСТАНОВИТЕ С ИСПОЛЬЗОВАНИЕМ ЭТОГО ВАШЕГО ИЗОБРАЖЕНИЯ», и люди все равно перевернут день, когда они, наконец, удалили его. Я считаю, что устаревшее подразумевает «когда-нибудь мы хотим это извлечь, поэтому, пожалуйста, прекратите использовать его», даже если на практике это редко происходит – Michael Mrozek 31 May 2010 в 08:24
  • 3
    @Michael Mrozek: не согласен с утверждением It certainly doesn't create a performance issue; его слишком субъективно заявить, что. – KMån 31 May 2010 в 08:44
  • 4
    @KMan Функция, отмеченная как устаревшая, не делает ее менее эффективной, чем прежде, чем она будет помечена - она ​​будет работать точно так же, как и раньше – Michael Mrozek 31 May 2010 в 18:09
  • 5
    @Michael Borgwardt: Вот как это работает на большинстве стандартизованных языков. И, конечно же, если бы что-то не одобрялось, чтобы удалить его из стандарта, популярные реализации сохранили бы его как расширение. – David Thornley 5 August 2010 в 15:06

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

2
ответ дан Petar Minchev 23 August 2018 в 01:19
поделиться
  • 1
    Removed? См. Определение stackoverflow.com/questions/2941900/… – KMån 31 May 2010 в 08:47
  • 2
    @KMan - в полученной вами ссылке написано - «Метод хранится в API для обратной совместимости в течение неопределенного периода времени и может в будущих выпусках удаляться». Я написал то же самое - некоторые из устаревших методов, возможно, удалены в ближайшем или далеком будущем. – Petar Minchev 31 May 2010 в 09:26

Помимо всех превосходных ответов выше, я обнаружил, что есть еще одна причина, чтобы удалить устаревшие вызовы API.

Изучать, почему вызов устарел. Я часто нахожу, что изучаю интересные вещи о Java / API / Рамочной основы. Часто существует веская причина, почему метод устаревает, и понимание этих причин приводит к более глубокому пониманию.

Итак, с точки зрения обучения / роста, это также стоит усилий

17
ответ дан Peter Tillemans 23 August 2018 в 01:19
поделиться

Конечно, нет - поскольку вся Java получает @Deprecated :-), вы можете свободно использовать их до тех пор, пока Java длится. Не собираюсь замечать каких-либо различий, если только это не сломано. Значение - нужно прочитать об этом, а затем решить.

В .Net однако, когда что-то объявлено [Устаревшим], немедленно идите об этом, даже если вы никогда не использовали его раньше - у вас есть около 50% шанс, что он более эффективен и / или проще в использовании, чем замена: -))

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

1
ответ дан ZXX 23 August 2018 в 01:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: