java methods deprecated

¿Es incorrecto usar métodos o clases obsoletas en Java?



methods deprecated (15)

Estoy usando eclipse para desarrollar una aplicación web. Justo hoy he actualizado mi versión de struts cambiando el archivo JAR. Recibo advertencias en algunos lugares de que los métodos están en desuso, pero el código funciona bien.

Quiero saber algunas cosas

  1. ¿Es incorrecto usar métodos o clases obsoletas en Java?

  2. ¿Qué sucede si no cambio ningún método y ejecuto mi aplicación con las advertencias que tengo? ¿Creará algún problema de rendimiento?


¿Es incorrecto utilizar métodos o clases obsoletas en Java?

No está mal como tal, pero puede ahorrarle algunos problemas. Aquí hay un ejemplo en el que se desaconseja encarecidamente el uso de un método en desuso:

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

¿Por qué Thread.stop está en desuso?

Porque es inherentemente inseguro. Detener un hilo hace que desbloquee todos los monitores que ha bloqueado. (Los monitores se desbloquean porque la excepción ThreadDeath se propaga por la pila). Si alguno de los objetos previamente protegidos por estos monitores estaba en un estado incoherente, es posible que otros hilos vean estos objetos en un estado incoherente. Dichos objetos se dice que están dañados. Cuando los hilos operan en objetos dañados, puede resultar en un comportamiento arbitrario. Este comportamiento puede ser sutil y difícil de detectar, o puede ser pronunciado. A diferencia de otras excepciones no verificadas, ThreadDeath mata los hilos silenciosamente; por lo tanto, el usuario no tiene ninguna advertencia de que su programa puede estar dañado. La corrupción puede manifestarse en cualquier momento después de que ocurra el daño real, incluso horas o días en el futuro.

¿Qué sucede si no cambio ningún método y ejecuto mi aplicación con las advertencias que tengo? ¿Creará algún problema de rendimiento?

No debería haber problemas en términos de rendimiento. La API estándar está diseñada para respetar cierta compatibilidad con versiones anteriores, por lo que las aplicaciones se pueden adaptar gradualmente a las versiones más nuevas de Java.


1. ¿Es incorrecto usar métodos o clases obsoletas en Java?

De la definición de obsoleto :

Un elemento de programa anotado @Deprecated es uno que se desaconseja a los programadores, por lo general porque es peligroso o porque existe una mejor alternativa.

El método se mantiene en la API para compatibilidad con versiones anteriores durante un período de tiempo no especificado, y puede que en futuras versiones se elimine. Es decir, no, no está mal , pero hay una forma mejor de hacerlo, que es más robusto frente a los cambios de API.

2. ¿Qué sucede si no cambio ningún método y ejecuto mi aplicación con las advertencias que tengo? ¿Creará algún problema de rendimiento?

Probablemente no. Continuará funcionando como antes de la depreciación. El contrato del método API no cambiará. Si alguna estructura interna de datos cambia a favor de un método nuevo y mejor, podría haber un impacto en el rendimiento, pero es bastante improbable.

La desaprobación más divertida en la API de Java es imo, FontMetrics.getMaxDecent . Motivo de desaprobación: error ortográfico.

Obsoleto. A partir de JDK versión 1.1.1, reemplazado por getMaxDescent ().


Terminología

Del glosario oficial de Sun:

deprecation : se refiere a una clase, interfaz, constructor, método o campo que ya no se recomienda, y puede dejar de existir en una versión futura.

De la guía de cómo y cuándo desaprobar:

Es posible que haya escuchado el término "humor que se autodesprecia" o humor que minimiza la importancia del orador. Una clase o método obsoleto es así. Ya no es importante. De hecho, es tan importante que ya no deberías usarlo, ya que ha sido reemplazado y puede dejar de existir en el futuro.

La anotación @Deprecated fue un paso más allá y advierte de peligro:

Un elemento de programa anotado @Deprecated es uno que se desaconseja a los programadores, por lo general porque es peligroso o porque existe una mejor alternativa.

Referencias

¿Bien o mal?

La cuestión de si es correcto o incorrecto utilizar métodos obsoletos tendrá que examinarse de forma individual. Aquí están TODAS las citas donde aparece la palabra "desaprobado" en Effective Java 2nd Edition :

Elemento 7: Evite los finalizadores : los únicos métodos que afirman garantizar la finalización son System.runFinalizersOnExit y su gemela malvada Runtime.runFinalizersOnExit . Estos métodos son fatalmente defectuosos y han sido desaprobados.

Elemento 66: sincronice el acceso a los datos mutables compartidos : las bibliotecas proporcionan el método Thread.stop , pero este método fue desaprobado hace mucho tiempo debido a que es intrínsecamente inseguro ; su uso puede provocar daños en los datos.

Elemento 70: seguridad del subproceso de documento : el método System.runFinalizersOnExit es hostil a subprocesos y ha quedado obsoleto.

Elemento 73: Evitar grupos de hilos : Permiten aplicar ciertas primitivas de Thread a un grupo de hilos a la vez. Varias de estas primitivas han quedado obsoletas, y el resto se usan con poca frecuencia. [...] los grupos de hilos están obsoletos.

Así que al menos con todos los métodos anteriores, es claramente incorrecto usarlos, al menos según Josh Bloch.

Con otros métodos, tendría que considerar los problemas individualmente, y entender POR QUÉ estaban obsoletos, pero en términos generales, cuando la decisión de desaprobar está justificada, tenderá a inclinarse más hacia la derecha que hacia la derecha para continuar usándola.

Preguntas relacionadas


  1. En general no, no es absolutamente incorrecto utilizar métodos en deprecated siempre que tenga un buen plan de contingencia para evitar cualquier problema si / esos métodos desaparecen de la biblioteca que está utilizando. Con la API de Java en sí misma, esto nunca sucede, pero con casi cualquier otra cosa significa que se eliminará. Si planifica específicamente no actualizar ( aunque es probable que a largo plazo ) las bibliotecas de soporte de su software, entonces no hay problema en el uso de métodos deprecated .
  2. No.

Además de todas las excelentes respuestas anteriores, descubrí que hay otra razón para eliminar llamadas obsoletas a la API.

Investigar por qué una llamada está obsoleta. A menudo me encuentro aprendiendo cosas interesantes sobre Java / la API / el Framework. A menudo hay una buena razón por la cual un método se está desaprobando y la comprensión de estas razones conduce a ideas más profundas.

Entonces, desde una perspectiva de aprendizaje / crecimiento, también es un esfuerzo que vale la pena


Ciertamente, no crea un problema de rendimiento: los medios obsoletos en el futuro es probable que la función ya no sea parte de la biblioteca, por lo que debe evitar usarla en un código nuevo y cambiar su código anterior para dejar de usarlo, por lo que no se encuentra con problemas un día cuando actualiza struts y encuentra que esa función ya no está presente


En Java está @Deprecated, en C # está [Obsoleto].

Creo que prefiero la terminología de C #. Solo significa que es obsoleto. Todavía puede usarlo si lo desea, pero probablemente haya una mejor manera.

Es como usar Windows 3.1 en lugar de Windows 7 si cree que Windows 3.1 está obsoleto. Todavía puede usarlo, pero probablemente haya mejores características en una versión futura, además de que las versiones futuras probablemente sean compatibles, la obsoleta no lo será.

Lo mismo ocurre con el @Deprecated de Java; aún puede usar el método, pero bajo su propio riesgo; en el futuro, podría tener mejores alternativas e incluso podría no ser compatible.

Si está utilizando un código que está en desuso, por lo general está bien, siempre que no tenga que actualizar a una API más nueva: es posible que el código obsoleto no exista allí. Sugiero que, si ve algo que usa código en desuso, lo actualice para usar las alternativas más nuevas (esto generalmente se señala en la anotación o en un comentario desaprobado de Javadoc).

Editar: Y como lo señala Michael, si el motivo de la obsolescencia se debe a un defecto en la funcionalidad (o porque la funcionalidad ni siquiera debería existir), obviamente no se debe usar el código obsoleto.


Es posible que haya escuchado el término "humor autocrítico". Ese es el humor que minimiza su importancia. Una clase o método obsoleto es así. Ya no es importante. De hecho, es tan importante que ya no debe utilizarse, ya que probablemente dejará de existir en el futuro.

Intenta evitarlo


No está mal, pero algunos de los métodos desaprobados se eliminan en las versiones futuras del software, por lo que posiblemente termines sin código de trabajo.


No está mal, simplemente no es recomendable. En general, significa que en este punto hay una mejor manera de hacer las cosas y que haría bien si utiliza la nueva forma mejorada. Algunas cosas en desuso son realmente peligrosas y deben evitarse por completo. La nueva forma puede producir un mejor rendimiento que la obsoleta, pero no siempre es así.


Por supuesto que no, ya que todo el Java se está @Deprecated :-) puedes utilizarlos mientras dure Java. No voy a notar ninguna diferencia de todos modos, a menos que sea algo realmente roto. Significado - tiene que leer sobre eso y luego decidir.

En .Net, sin embargo, cuando algo se declara [Obsoleto], ve y lee sobre él de inmediato, incluso si nunca lo has usado antes: tienes un 50% de probabilidad de que sea más eficiente y / o más fácil de usar que el reemplazo :-))

Entonces, en general, puede ser bastante beneficioso ser tecnoconservador en estos días, pero primero tienes que hacer tu tarea de lectura.


Siento que el método obsoleto significa; hay un método alternativo disponible que es mejor en todos los aspectos que el método existente. Es mejor usar el buen método que el método antiguo existente. Por compatibilidad con versiones anteriores, los métodos antiguos se dejan como obsoletos.


Todavía puede usar código en desuso sin que se modifique el rendimiento, pero el objetivo de desaprobar un método / clase es hacerles saber a los usuarios que ahora hay una mejor manera de usarlo, y que en una versión futura es probable que se elimine el código obsoleto.


¿Es incorrecto usar métodos o clases obsoletas en Java? No está "mal", sigue funcionando, pero evítelo tanto como sea posible.

Supongamos que hay una vulnerabilidad de seguridad asociada con un método y los desarrolladores determinan que es un defecto de diseño. Entonces pueden decidir desaprobar el método e introducir la nueva forma.

Entonces, si sigues usando el método anterior, tienes una amenaza. Así que tenga en cuenta el motivo de la desaprobación y compruebe si le afecta.

¿Qué pasa si no cambio ningún método y ejecuto mi aplicación con las advertencias que tengo? ¿Creará algún problema de rendimiento?

Si la depreciación se debe a un problema de rendimiento, entonces sufrirá un problema de rendimiento, de lo contrario no hay razón para tener tal problema. Una vez más quisiera señalar, tenga en cuenta el motivo de la depreciación.


Sí, está mal.

Los métodos o clases obsoletas se eliminarán en versiones futuras de Java y no se deberían usar. En cada caso, debe haber una alternativa disponible. Usa eso.

Hay un par de casos en los que debe usar una clase o un método obsoleto para alcanzar el objetivo del proyecto. En este caso, realmente no tienes más remedio que usarlo. Las versiones futuras de Java pueden romper ese código, pero si es un requisito, debes vivir con eso. Probablemente no sea la primera vez que tiene que hacer algo mal para cumplir con un requisito del proyecto, y ciertamente no será el último.

Cuando actualiza a una nueva versión de Java o alguna otra biblioteca, a veces un método o una clase que estaba utilizando queda obsoleto. Los métodos obsoletos no son compatibles, pero no deben producir resultados inesperados. Sin embargo, eso no significa que no lo hagan, así que cambie su código lo antes posible.

El proceso de desactivación está ahí para garantizar que los autores tengan tiempo suficiente para cambiar su código de una API anterior a una API nueva. Haz uso de este tiempo. Cambia tu código a la mayor brevedad posible.