Java에서 더 이상 사용되지 않는 메소드 또는 클래스를 사용하는 것이 잘못 되었습니까?


153

웹 응용 프로그램을 개발하기 위해 이클립스를 사용하고 있습니다. 바로 오늘 JAR 파일을 변경하여 struts 버전을 업데이트했습니다. 메소드가 더 이상 사용되지 않는다는 경고가 표시되지만 코드는 제대로 작동합니다.

몇 가지를 알고 싶습니다

  1. Java에서 더 이상 사용되지 않는 메소드 또는 클래스를 사용하는 것이 잘못 되었습니까?

  2. 방법을 변경하지 않고 경고 메시지와 함께 응용 프로그램을 실행하면 성능 문제가 발생합니까?


7
1955 Volkswagen Beetle제공되는 경우에도 Corvette Stingray무료로 '계속'하시겠습니까 ? (0 :
KMån

75
@KMan 유럽 자동차와 미국 자동차를 비교하고
있습니까

2
@Ponzao 및 4기타 : Gotcha! (0;
KMån

2
잘못된? 우리는 여기서 필멸의 존재 나 정직한 박탈을 이야기하고 있습니까?
FastAl

5
@Alexander는 귀하의 의견에 대해 투표하지 않으므로 귀하의 의견에 +1하십시오. 비교는 더 좋은 사이가 될 것입니다 1955 Volkswagen Beetle1956 Volkswagen Beetle새 타이어 깰 때 당신이 알고하지 않습니다!
Aleks

답변:


265

1. Java에서 더 이상 사용되지 않는 메소드 또는 클래스를 사용하는 것이 잘못 되었습니까?

에서 사용되지 않는의 정의 :

@Deprecated로 주석이 달린 프로그램 요소는 일반적으로 위험하거나 더 나은 대안이 있기 때문에 프로그래머가 사용하지 않는 것이 좋습니다.

이 방법은 지정되지 않은 기간 동안 이전 버전과의 호환성을 위해 API에 유지되며 향후 릴리스에서 제거 될 수 있습니다. 즉, 그것은 틀린 것이 아니지만 API를 변경하는 데 더 강력한 방법이 있습니다.

2. 메소드를 변경하지 않고 경고 메시지와 함께 애플리케이션을 실행하면 성능 문제가 발생합니까?

아마도 아닙니다. 지원 중단 전과 같이 계속 작동합니다. API 방법의 계약은 변경되지 않습니다. 일부 내부 데이터 구조가 새롭고 더 나은 방법으로 변경되면 성능에 영향을 줄 수 있지만 그럴 가능성은 거의 없습니다.


재미있는의 중단 자바 API에서는,이 IMO입니다 FontMetrics.getMaxDecent. 지원 중단 사유 : 맞춤법 오류

더 이상 사용되지 않습니다. JDK 버전 1.1.1부터 getMaxDescent ()로 대체되었습니다.


5
Java API에서 다음으로 가장 재미있는 지원 중단은 AbstractButton (Swing)에서 setMultiClickThreshhold (int threshhold) 및 getMultiClickTreshhold ()입니다. 그 두 가지를 준비하십시오! ;)
JavaTechnical

3
HTTP REFERER로이를 수행해야합니다. 화를
내다

1
@DaveMcClelland, 69 : D에서 70으로 만들었습니다.)
VdeX

28

성능이 변경되지 않고 더 이상 사용되지 않는 코드를 계속 사용할 수 있지만 메소드 / 클래스를 더 이상 사용하지 않는 요점은 사용자에게 더 나은 사용 방법이 있음을 알리고 향후 릴리스에서 더 이상 사용되지 않는 코드가 제거 될 수 있다는 것입니다.


1
성능의 변화가 없는지 어떻게 확인할 수 있습니까? deprication을 예컨대 인해 내부 데이터 구조의 변화 될 인스턴스의 TreeSet의 HashSet의로에서 말한다.
aioobe

@aioobe-이해하기 위해 OP는 더 이상 사용되지 않는 코드를 호출 할 때 성능 문제가 있는지 묻습니다.이 코드는 생성 된 바이트 코드를 변경하지 않았 음을 나타냅니다 (1.5 이전의 javadoc에서는 주석이 사용 중이지만 여전히 성능에 변화가 없음)
abyx

라이브러리의 한 버전에서 다른 버전으로 갈 때 새 버전의 메소드의 바이트 코드가 이전 버전의 동일한 메소드의 바이트 코드와 동일하다는 보장은 없습니다.
aioobe

@ aioobe-단순히 더 이상 사용되지 않도록 설정하면 바이트 코드가 변경되지 않는다는 보장이 있습니다. 이것이 OP가 의미하는 바입니다. 물론 코드 자체가 변경되므로 코드가 더 이상 사용되지 않습니다.
abyx

이전과 동일한 버전을 계속 사용하면 아무런 변화가 없습니다. 그러나 최신 버전의 라이브러리를 사용하고 API를 더 이상 사용하지 않는 경우 기본 구현이 크게 변경되고 새 API가이를 활용하는 경우 성능이 변경 될 수 있지만 이전 API는 그렇지 않습니다. 이 새로운 구조에 비해 예전처럼 효율적입니다.
gregturn

21

술어

공식 Sun 용어집에서 :

deprecation : 더 이상 권장되지 않으며 향후 버전에서 더 이상 존재하지 않을 수있는 클래스, 인터페이스, 생성자, 메소드 또는 필드를 나타냅니다.

사용 방법과 사용 중단 시점에 이르기까지 :

"자기 폐지 유머"또는 화자의 중요성을 최소화하는 유머라는 용어를 들어 보셨을 것입니다. 더 이상 사용되지 않는 클래스 또는 메소드는 이와 같습니다. 더 이상 중요하지 않습니다. 실제로 중요하지 않으므로 더 이상 사용하지 않아야합니다. 대체되지 않았으며 앞으로는 더 이상 존재하지 않을 수 있습니다.

@Deprecated주석이 한 단계 더 가서 위험을 경고 :

주석 @Deprecated이 달린 프로그램 요소 는 일반적으로 위험 하거나 더 나은 대안이 있기 때문에 프로그래머가 사용하지 않는 것입니다 .

참고 문헌


옳고 그름?

더 이상 사용되지 않는 방법을 사용하는 것이 옳고 그른지에 대한 질문은 개별적으로 검사해야합니다. Effective Java 2nd Edition 에서 "deprecated" 라는 단어가 나오는 모든 인용문 은 다음과 같습니다 .

항목 7 : 피니셔를 피하십시오 : 피니셔를 보장한다고 주장하는 유일한 방법 System.runFinalizersOnExit은 악한 쌍둥이 Runtime.runFinalizersOnExit입니다. 이 방법은 치명적인 결함이 있으며 더 이상 사용되지 않습니다.

항목 66 : 변경 가능한 공유 데이터에 대한 액세스 동기화 : 라이브러리가 Thread.stop메소드를 제공 하지만이 메소드는 본질적으로 안전하지 않기 때문에 더 이상 사용되지 않습니다. 사용하면 데이터가 손상 될 수 있습니다.

항목 70 : 문서 스레드 안전성 :이 System.runFinalizersOnExit메소드는 스레드에 적대적이며 더 이상 사용되지 않습니다.

항목 73 : 쓰레드 그룹 피하기 : 특정 Thread프리미티브를 한 번에 여러 쓰레드에 적용 할 수 있습니다 . 이러한 기본 요소 중 일부는 더 이상 사용되지 않으며 나머지는 자주 사용되지 않습니다. [...] 스레드 그룹은 더 이상 사용되지 않습니다.

따라서 적어도 위의 모든 방법을 사용하면 적어도 Josh Bloch에 따르면이 방법을 사용하는 것은 분명히 잘못되었습니다.

다른 방법을 사용하면 문제를 개별적으로 고려하고 더 이상 사용되지 않는 이유 를 이해해야 하지만 일반적으로 더 이상 사용하지 않기로 한 결정이 정당화되면 계속해서 사용하는 것이 옳은 것보다 잘못되는 경향이 있습니다.

관련 질문


3
"더 이상 사용되지 않음"은 라틴어 "de"+ "precare"에서 "기도하다"를 의미합니다. 더 이상 사용되지 않는 것으로 설명 될 때 표준은기도하고 간청합니다. 해당 표준의 향후 버전에서 제거 될 수 있다는 경고입니다. 더 이상 사용되지 않는 기능은 해당 표준의 현재 버전을 구현할 때 완전히 구현되어야합니다. 하지만 더 이상 사용되지 않는 유머에 대한 언급은 다소 미미합니다. 그런 의미에서 "자기 비추천"은 다른 유도와 의미를 갖는 "자기 비만"의 부패입니다.
dajames

17

위의 모든 훌륭한 응답 외에도 더 이상 사용되지 않는 API 호출을 제거 해야하는 또 다른 이유가 있습니다.

호출이 더 이상 사용되지 않는 이유를 조사 해보면 Java / API / Framework에 대해 흥미로운 것을 배우는 경우가 많습니다. 메소드가 더 이상 사용되지 않는 이유가 종종 있으며 이러한 이유를 이해하면 더 깊은 통찰력을 얻을 수 있습니다.

따라서 학습 / 성장 관점에서 볼 때 그것은 또한 가치있는 노력입니다


11

확실히 성능 문제를 일으키지 않습니다. 더 이상 사용되지 않으므로 향후 함수가 더 이상 라이브러리의 일부가 아닐 가능성이 있으므로 새 코드에서 사용하지 말고 사용을 중지하도록 이전 코드를 변경해야합니다. 스트럿을 업그레이드 할 때 언젠가 문제가 발생하지 않고 기능이 더 이상 존재하지 않음을 발견했습니다.


1
경험에 비추어 볼 때, "더 이상 사용되지 않는다"는 것은 "더 이상 이것을 사용해서는 안되지만 영원히 사용할 수있을 것"을 의미합니다. 적어도 Java 표준 API의 경우 더 이상 사용되지 않는 메소드 또는 클래스가 실제로 제거되는 것을 알지 못합니다.
Michael Borgwardt

1
@Michael 글쎄, 실제로 API는 "경고 :이 사용을 중지하십시오"라는 출력을 컴파일러에서 사용하여 10 년 동안 사용이 중단 될 수 있기 때문에 사용되지 않는 기능을 거의 제거하지 않습니다. 실제로는 거의 발생하지 않더라도 "
언제나

@Michael Mrozek : 진술에 동의하지 않습니다 It certainly doesn't create a performance issue. 그것은 너무 주관적이라고 진술합니다.
KMån

1
@KMan 더 이상 사용되지 않는 것으로 표시되는 함수는 표시되기 이전보다 효율성을 떨어 뜨리지 않습니다. 이전과 정확히 동일하게 실행됩니다.
Michael Mrozek

@ Michael Borgwardt : 이것이 가장 표준화 된 언어로 작동하는 방식입니다. 그리고 더 이상 사용되지 않는 것을 표준에서 제거해야한다면 널리 사용되는 구현은이를 확장으로 유지합니다.
David Thornley

8

그것은 잘못이 아니며 권장하지 않습니다. 그것은 일반적으로이 시점에서 더 나은 일을하는 방법이 있다는 것을 의미하며, 새로운 개선 된 방법을 사용한다면 좋은 일을 할 것입니다. 더 이상 사용되지 않는 일부 항목은 실제로 위험하므로 완전히 피해야합니다. 새로운 방식은 더 이상 사용되지 않는 방식보다 더 나은 성능을 제공 할 수 있지만 항상 그런 것은 아닙니다.


8

"자기 폐지 유머"라는 용어를 들어 보셨을 것입니다. 그것은 당신의 중요성을 최소화하는 유머입니다. 더 이상 사용되지 않는 클래스 또는 메소드는 이와 같습니다. 더 이상 중요하지 않습니다. 실제로는 더 이상 중요하지 않으므로 앞으로는 더 이상 존재하지 않을 것입니다.

그것을 피하십시오


4
  1. 일반적으로 아니요, 사용 deprecated중인 라이브러리에서 해당 메소드가 사라지는 경우 / 문제가 발생하지 않도록 적절한 비상 계획을 가지고있는 한 메소드 를 사용 하는 것이 절대로 잘못된 것은 아닙니다 . Java API 자체로는 이런 일이 발생하지 않지만 다른 일이 발생하면 제거 될 것입니다. 소프트웨어의 지원 라이브러리 를 업그레이드하지 않을 계획이라면 ( 장기적으로는 장기적으로 사용해야하지만 ) deprecated메소드 를 사용 하는 데 문제가 없습니다 .
  2. 아니.

3

그렇습니다.

더 이상 사용되지 않는 메소드 또는 클래스는 향후 버전의 Java에서 제거되므로 사용하지 않아야합니다. 각각의 경우, 가능한 대안이 있어야합니다. 사용하십시오.

프로젝트 목표를 달성하기 위해 더 이상 사용되지 않는 클래스 또는 메소드를 사용해야하는 경우가 몇 가지 있습니다. 이 경우 실제로 사용할 수밖에 없습니다. 향후 버전의 Java는 해당 코드를 손상시킬 수 있지만 요구 사항이있는 경우이를 준수해야합니다. 프로젝트 요구 사항을 충족하기 위해 처음으로 잘못한 것은 아니며 아마도 마지막이 아닐 수도 있습니다.

새 버전의 Java 또는 다른 라이브러리로 업그레이드 할 때 사용중인 메서드 나 클래스가 더 이상 사용되지 않는 경우가 있습니다. 더 이상 사용되지 않는 메소드는 지원되지 않지만 예기치 않은 결과가 발생하지 않아야합니다. 그렇다고해서 코드가 최대한 빨리 전환되지는 않습니다.

사용 중단 프로세스는 작성자가 코드를 이전 API에서 새 API로 변경하기에 충분한 시간을 갖도록하기위한 것입니다. 이 시간을 활용하십시오. 최대한 빨리 코드를 변경하십시오.


2

잘못된 것은 아니지만 차후 버전의 소프트웨어에서는 더 이상 사용되지 않는 메소드가 제거되어 작동하지 않는 코드로 끝날 수 있습니다.



1
@KMan-게시 한 링크에 "지정되지 않은 기간 동안 이전 버전과의 호환성을 위해이 메소드가 API에 유지되며 향후 릴리스에서 제거 될 수 있습니다." 나는 똑같은 것을 썼다. 더 이상 사용되지 않는 메소드 중 일부는 가까운 장래 또는 먼 미래에 제거 될 수 있습니다.
Petar Minchev

2

Java에서 더 이상 사용되지 않는 메소드 또는 클래스를 사용하는 것이 잘못 되었습니까? "

그렇게 잘못되지는 않지만 문제를 해결할 수 있습니다. 더 이상 사용되지 않는 메소드를 사용하지 않는 것이 좋은 예입니다.

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

Thread.stop이 더 이상 사용되지 않는 이유는 무엇입니까?

본질적으로 안전하지 않기 때문입니다. 스레드를 중지하면 스레드가 잠근 모든 모니터의 잠금이 해제됩니다. (ThreadDeath 예외가 스택을 전파함에 따라 모니터가 잠금 해제됩니다.) 이전에 이러한 모니터로 보호 된 오브젝트 중 하나가 일관성이없는 상태 인 경우 다른 스레드가이 오브젝트를 일치하지 않는 상태로 볼 수 있습니다. 이러한 물체는 손상되었다고합니다. 스레드가 손상된 객체에서 작동하면 임의의 동작이 발생할 수 있습니다. 이 동작은 미묘하고 감지하기 어려울 수 있습니다. 확인되지 않은 다른 예외와 달리 ThreadDeath는 스레드를 자동으로 종료합니다. 따라서 사용자는 자신의 프로그램이 손상되었다는 경고를받지 않습니다. 실제 손상이 발생한 후 언제라도 몇 시간 또는 며칠이라도 손상이 발생할 수 있습니다.


방법을 변경하지 않고 경고 메시지와 함께 응용 프로그램을 실행하면 성능 문제가 발생합니까?

성능 측면에서 문제가 없어야합니다. 표준 API는 일부 이전 버전과의 호환성을 고려하여 애플리케이션을 최신 버전의 Java에 점차적으로 적용 할 수 있도록 설계되었습니다.


2

Java에서 더 이상 사용되지 않는 메소드 또는 클래스를 사용하는 것이 잘못 되었습니까? "잘못"되지 않고 여전히 작동하지만 가능한 한 많이 피하십시오.

메소드와 관련된 보안 취약점이 있고 개발자가 설계 결함이라고 판단한다고 가정하십시오. 그래서 그들은 방법을 폐기하고 새로운 방식을 도입하기로 결정할 수 있습니다.

따라서 여전히 이전 방법을 사용하면 위협이 있습니다. 따라서 지원 중단 사유를 알고 그것이 귀하에게 어떤 영향을 미치는지 확인하십시오.

방법을 변경하지 않고 경고 메시지로 응용 프로그램을 실행하면 성능 문제가 발생합니까?

지원 중단으로 인해 성능 문제가 발생한 경우 성능 문제가 발생하며, 그렇지 않으면 그러한 문제가 발생할 이유가 없습니다. 다시 한 번 지적하고 싶습니다. 더 이상 사용되지 않는 이유를 알고 있어야합니다.


2

Java에서는 @Deprecated이고 C #에서는 [Obsolete]입니다.

C #의 용어를 선호한다고 생각합니다. 그것은 쓸모가 없다는 것을 의미합니다. 원한다면 여전히 사용할 수 있지만 더 좋은 방법이있을 것입니다.

Windows 3.1이 더 이상 사용되지 않는다고 생각하면 Windows 7 대신 Windows 3.1을 사용하는 것과 같습니다. 여전히 사용할 수는 있지만 향후 버전에는 더 나은 기능이있을 수 있으며 향후 버전은 지원 될 것입니다.

Java의 @Deprecated와 동일-메소드를 계속 사용할 수는 있지만 위험 부담은 향후 더 나은 대안이있을 수 있으며 지원되지 않을 수도 있습니다.

더 이상 사용되지 않는 코드를 사용하는 경우 최신 API로 업그레이드 할 필요가없는 한 일반적으로 좋습니다. 더 이상 사용되지 않는 코드가 없을 수 있습니다. 더 이상 사용되지 않는 코드를 사용하고 새로운 대안을 사용하도록 업데이트하는 것이 있으면 일반적으로 주석 또는 Javadoc 더 이상 사용되지 않는 주석에서 지적합니다.

편집 : Michael이 지적한 것처럼, 사용 중단 사유가 기능상의 결함으로 인해 (또는 기능이 존재하지 않아야하기 때문에) 사용되지 않는 코드를 사용해서는 안됩니다.


1
"더 이상 사용되지 않는 코드를 사용하는 경우 최신 API로 업그레이드 할 필요가없는 한 괜찮습니다." Thread.stop ()이 더 이상 사용되지 않는 이유를 살펴보면 JRE 버전에서 이것이 좋지 않다는 것을 알 수 있습니다.
Michael

좋아, 나는 "보통"괜찮다고 말해야한다. (그 비트를 업데이트 할 것이다.) 더 이상 사용되지 않는 이유가 기능상의 결함을 막는 것이면 사용하지 않는 것이 좋습니다. 그러나 일반적으로 더 이상 사용되지 않는 방법을 사용하는 것이 좋습니다. 그래서 ja, 그것은 모두 지원 중단 사유에 달려 있습니다. 진실.
jamiebarrow

1

물론 아닙니다-전체 Java가 @Deprecated :-)를 받고 있기 때문에 Java가 지속되는 한 자유롭게 사용할 수 있습니다. 그것이 실제로 깨진 것이 아니라면 어쨌든 diff를 눈치 채지 못할 것입니다. 의미-그것에 대해 읽고 결정해야합니다.

그러나 .Net에서 무언가가 [폐기 됨]으로 선언되면 이전에 사용한 적이 없어도 즉시 그것에 대해 읽어보십시오-교체보다 더 효율적이고 사용하기 쉽습니다 :-))

일반적으로 요즘에는 기술적으로 보수적 인 것이 유리할 수 있지만, 먼저 읽기 집안일을해야합니다.


1

더 이상 사용되지 않는 방법이 의미한다고 생각합니다. 기존 방법보다 모든 측면에서 더 나은 대체 방법이 있습니다. 기존의 기존 방법보다 좋은 방법을 사용하는 것이 좋습니다. 이전 버전과의 호환성을 위해 이전 방법은 더 이상 사용되지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.