[java] Java에서 “최종 클래스”의 요점은 무엇입니까?

Java에 관한 책을 읽고 있으며 전체 클래스를로 선언 할 수 있다고 말합니다 final. 나는 이것을 사용할 곳을 생각할 수 없다.

나는 프로그래밍에 익숙 하지 않으며 프로그래머가 실제로 프로그램에서 이것을 사용 하는지 궁금 합니다. . 그들이 사용하는 경우, 언제 사용하면 더 잘 이해하고 사용시기를 알 수 있습니다.

Java가 객체 지향적이고 클래스를 선언하면 final객체의 특성을 가진 클래스의 아이디어를 멈추지 않습니까?



답변

우선, 나는이 기사를 추천합니다 : Java : 최종 클래스를 만들 때


그들이 사용하는 경우, 언제 사용하면 더 잘 이해하고 사용시기를 알 수 있습니다.

final클래스는 단순히 클래스 확장 할 수 없습니다 .

(이것은 클래스의 객체에 대한 모든 참조가 마치로 선언 된 것처럼 행동한다는 것을 의미하지는 않습니다 final.)

클래스를 final로 선언하는 것이 유용한 경우이 질문의 답변에서 다룹니다.

Java가 객체 지향적이고 클래스를 선언하면 final객체의 특성을 가진 클래스의 아이디어를 멈추지 않습니까?

어떤 의미에서는 그렇습니다.

클래스를 최종으로 표시하면 해당 코드 부분에 대해 강력하고 유연한 언어 기능이 비활성화됩니다. 일부 클래스는하지만, (그리고 어떤 경우에는 안 할 수 있는 좋은 방법에서 고려의 서브 클래스하도록 설계 할 수 없습니다)가. 이러한 경우 OOP를 제한하더라도 클래스를 최종 클래스로 표시하는 것이 좋습니다. 그러나 최종 클래스는 여전히 최종 클래스가 아닌 다른 클래스를 확장 할 수 있습니다.


답변

Java에서 final 수정자가있는 변경할 수 없습니다!

여기에는 최종 클래스, 최종 변수 및 최종 메소드가 포함됩니다.

  • 마지막 수업은 다른 수업으로 확장 할 수 없습니다
  • 최종 변수는 다른 값을 재 할당 할 수 없습니다
  • 최종 방법은 재정의 할 수 없습니다

답변

보안상의 이유로 클래스 상속방지 하려는 경우 final이 중요한 시나리오 . 이를 통해 실행중인 코드를 다른 사람 이 재정의 할 수 없도록 할 수 있습니다 .

또 다른 시나리오는 최적화입니다 .Java 컴파일러는 최종 클래스에서 일부 함수 호출을 인라인한다는 것을 기억합니다. 따라서 호출 a.x()하고 a가 선언 final되면 컴파일 타임에 코드가 무엇인지 알고 호출 함수에 인라인 할 수 있습니다. 이것이 실제로 수행되는지 여부는 알 수 없지만 최종적으로는 가능합니다.


답변

가장 좋은 예는

공개 최종 클래스 문자열

불변 클래스이며 확장 할 수 없습니다. 물론, 클래스를 최종적으로 불변으로 만드는 것 이상이 있습니다.


답변

관련 자료 : Bob Martin 의 공개 원칙 .

주요 인용문 :

확장을 위해 소프트웨어 엔터티 (클래스, 모듈, 기능 등)가 열려 있어야하지만 수정을 위해 닫혀 있어야합니다.

final키워드는 방법이나 클래스에 사용되는 여부, 자바에서이를 시행 할 수있는 수단입니다.


답변

클래스 계층 구조를 Java와 같이 트리로 생각하면 추상 클래스는 분기 일 수 있고 최종 클래스는 리프 일 수있는 클래스입니다. 이러한 범주에 속하지 않는 수업은 가지와 잎이 될 수 있습니다.

여기서 OO 원칙을 위반하지 않으며 final은 단순히 훌륭한 대칭을 제공합니다.

실제로 객체를 불변으로 만들거나 API를 작성하는 경우 final을 사용하여 클래스의 확장이 아닌 API 사용자에게 신호를 보냅니다.


답변

키워드 final자체는 최종적인 것을 의미하며 어떤 식 으로든 수정해서는 안됩니다. 클래스가 표시되어 있으면 final확장하거나 하위 클래스 로 만들 수 없습니다. 그러나 문제는 왜 우리가 수업을 표시 final합니까? IMO에는 여러 가지 이유가 있습니다.

  1. 표준화 : 일부 클래스는 표준 기능을 수행하며 문자열 조작 또는 수학 함수 등과 관련된 다양한 기능을 수행하는 클래스와 같이 수정되지 않습니다.
  2. 보안 이유 : 때로는 다양한 인증 및 암호 관련 기능을 수행하는 클래스를 작성하고 다른 사람이 변경하지 않기를 바랍니다.

나는 마킹 클래스가 final효율성을 향상 시킨다고 들었지만 솔직히 말해서 많은 무게를 지니고있는이 주장을 찾을 수 없었습니다.

Java가 객체 지향적이며 클래스를 final로 선언하면 객체의 특성을 가진 클래스의 아이디어를 멈추지 않습니까?

아마도 그렇습니다. 그러나 때때로 그것은 의도 된 목적입니다. 때때로 우리는이 클래스의 능력을 확장하여 보안 등의 더 큰 이점을 얻기 위해 그렇게합니다. 그러나 필요한 경우 최종 클래스는 여전히 하나의 클래스를 확장 할 수 있습니다.

참고로 상속보다 구성을 선호 해야 하며 final키워드는 실제로이 원칙을 시행하는 데 도움이됩니다.