programing

Java에서 상속을 금지해야 하는 좋은 이유?

prostudy 2022. 4. 25. 21:39
반응형

Java에서 상속을 금지해야 하는 좋은 이유?

예를 들어, 최종 클래스 또는 클래스를 사용하여 Java에서 상속을 금지하는 좋은 이유는 무엇인가?메소드 파이널을 만드는 좋은 이유는 무엇인가?

여기서 가장 잘 참고할 수 있는 것은 "상속을 위한 설계와 문서 또는 기타 금지"라고 불리는 조슈아 블로흐의 훌륭한 책 "효과적인 자바"의 19번 항목이다.(제2판 17번 항목이고 제1판 15번 항목이다.)꼭 읽어봐야겠지만, 요약해 줄게.

만약 조상이 부모로부터 물려받도록 설계되지 않았다면 상속된 계층과 그들의 부모와의 상호 작용은 놀랍고 예측할 수 없을 것이다.

따라서 수업은 두 가지 종류로 이루어져야 한다.

  1. **xtxt***가 되도록 설계된 클래스 및 수행 방법을 설명하는 충분한 문서

  2. **최종**으로 표시된 클래스

만약 당신이 순수하게 내부 코드를 쓰고 있다면, 이것은 약간 과잉 살상일지도 모른다.그러나 클래스 파일에 5자를 추가하는 데 수반되는 추가 노력은 매우 적다.만약 당신이 내적인 소비만을 위해 글을 쓴다면, 미래의 코더는 항상 '최종'을 제거할 수 있다 - 당신은 그것을 "이 클래스는 유산을 염두에 두고 만들어진 것이 아니다"라고 경고하는 것으로 생각할 수 있다.

클래스를 재정의하면 다른 방법으로 카운트되는 동작을 변경할 수 없도록 메서드 파이널을 만드는 것이 좋다.생성자에서 호출되는 방법은 종종 최종으로 선언되기 때문에 당신은 물체를 만들 때 어떤 불쾌한 놀라움도 받지 않는다.

수업종료를 하는 한 가지 이유는 상속보다 작곡을 강요하고 싶은 경우일 것이다.이것은 일반적으로 계층 간의 긴밀한 결합을 피하는데 바람직하다.

최종 방법을 사용할 수 있는 사용 사례는 3가지 입니다.

  1. 파생 클래스가 특정 기본 클래스 기능을 재정의하지 않도록 하기 위해.
  2. 이는 기본 클래스가 파생 클래스가 변경해서는 안 되는 프레임워크의 중요한 핵심 기능을 제공하는 보안 목적을 위한 것이다.
  3. 최종 및 비공개 방식에는 가상 테이블 개념의 사용이 없기 때문에 최종 방법은 인스턴스 방식보다 빠르다.그러니 가능성이 있는 곳이라면 최종적인 방법을 써보도록 하라.

클래스 결승 진출 목적:

그래서 어떤 신체도 그러한 계층을 확장하고 그들의 행동을 변화시킬 수 없다.

예: 래퍼 클래스 정수(Inteute)는 최종 클래스다.만약 그 클래스가 최종 클래스가 아니라면, 누구나 정수 클래스를 자신의 클래스로 확장하고 정수 클래스의 기본 동작을 변경할 수 있다.이를 피하기 위해 자바는 모든 래퍼 클래스를 최종 클래스로 만들었다.

불변의 개체(http://en.wikipedia.org/wiki/Immutable_object),를 만들거나 효율성, 안전 또는 보안 등의 이유로 다른 사용자가 메서드를 재정의하는 것을 방지할 수 있다.

유산은 전기톱과 같다. 매우 강력하지만 잘못된 손에 있어서는 끔찍하다.상속할 클래스를 설계하거나(유연성을 제한할 수 있고 시간이 오래 걸릴 수 있음) 금지하십시오.

유효 자바 2판 항목 16 및 17 또는 내 블로그 게시물 "상속 세금"을 참조하십시오.

음... 두가지 생각이 나네.

특정 보안 문제를 다루는 클래스가 있을 수 있다.공격자는 이를 하위 분류하여 시스템에 하위 분류 버전을 제공함으로써 보안 제한을 우회할 수 있다.예를 들어, 응용 프로그램이 플러그인을 지원할 수 있으며 플러그인이 보안 관련 클래스를 하위 클래스로 분류할 수 있는 경우 이 방법을 사용하여 하위 클래스 버전의 플러그인을 제자리에 가져갈 수 있다.하지만, 이것은 오히려 썬이 사과와 그와 비슷한 것에 대해 다루어야 하는 것이고, 어쩌면 그렇게 현실적인 경우는 아닐지도 모른다.

훨씬 더 현실적인 것은 물체가 변이되는 것을 피하는 것이다.예: 문자열은 불변하므로 코드는 문자열에 대한 참조를 안전하게 보관할 수 있음

 String blah = someOtherString;

먼저 줄을 복사하는 대신에.그러나 하위 클래스를 사용할 수 있는 경우 문자열 값을 수정할 수 있는 메서드를 추가할 수 있으며, 이제 어떤 코드도 위의 문자열을 복사하기만 하면 문자열이 그대로 유지될 것이라고 더 이상 신뢰할 수 없으며, 대신 문자열을 복제해야 한다.

사람들이 자신과 다른 사람들을 혼란스럽게 할 수 있는 일을 하는 것을 막기 위해서입니다.정의된 상수나 계산이 있는 물리학 라이브러리를 상상해 보십시오.최종 키워드를 사용하지 않고 누군가가 와서 절대 바뀌지 말아야 할 기본 계산이나 상수를 재정의할 수 있다.

또한, 상업용 폐쇄 소스 클래스를 작성하는 경우, 특히 여러분이 이 클래스에 대한 지원을 해야 하고 사람들이 여러분의 방법을 무시했고 이 클래스를 호출하는 것이 예상치 못한 결과를 가져다 준다고 불평하는 경우, 여러분은 사람들이 기능성을 변경하지 않기를 바랄지도 모른다.

클래스와 메서드를 최종으로 표시하면 런타임이 지정된 개체에 대해 호출하기 위해 올바른 클래스 메서드를 검색할 필요가 없으므로 약간의 성능 향상을 발견할 수 있다.비최종 방법은 가상으로 표시하여 필요할 경우 적절하게 확장할 수 있으며, 최종 방법은 클래스에서 인라인으로 직접 연결하거나 컴파일할 수 있다.

클래스를 재정의하면 해당 동작이 변경되지 않도록 메서드 파이널을 만들려는 경우.행동을 바꿀 수 있기를 원할 때 방법을 공개한다.공개 방법을 재정의하면 변경될 수 있다.

참조URL: https://stackoverflow.com/questions/218744/good-reasons-to-prohibit-inheritance-in-java

반응형