source

자바어로 "최종 클래스"의 의미는 무엇입니까?

factcode 2022. 8. 27. 09:23
반응형

자바어로 "최종 클래스"의 의미는 무엇입니까?

을 읽고 , 수업 를 '자바'라고 선언하면 있어요.final이걸 어디에 쓸지 생각이 안 나요.

저는 프로그래밍을 처음이라 프로그래머들이 실제로프로그램을 사용하는지 궁금합니다.사용한다면 언제 사용하나요? 그래야 제가 더 잘 이해하고 언제 사용할지 알 수 있어요.

지향이고 Java를 하는 final사물의 특성을 가진 계층에 대한 생각을 멈추는 것은 아닐까?

먼저 다음 기사를 추천합니다.Java: 최종 클래스를 만드는 시기


사용한다면 언제 사용하나요? 그래야 제가 더 잘 이해하고 언제 사용할지 알 수 있어요.

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

( 모든 가 ('클래스의 오브젝트'가 final . )

클래스가 최종이라고 선언하는 것이 도움이 되는 경우, 이 질문의 답변에 기재되어 있습니다.

지향이고 Java를 하는 final사물의 특성을 가진 계층에 대한 생각을 멈추는 것은 아닐까?

어떤 의미에서는 그렇다.

클래스를 final로 표시하면 코드의 해당 부분에 대해 강력하고 유연한 언어의 기능을 사용할 수 없게 됩니다.그러나 일부 클래스는 하위 분류를 적절하게 고려하도록 설계되어서는 안 됩니다(경우에 따라서는 그럴 수 없습니다).이 경우 OOP를 제한하더라도 클래스를 최종 클래스로 표시하는 것이 타당합니다(단, 최종 클래스는 다른 비최종 클래스를 연장할 수 있습니다).

자바가 final식!자!!!!!!!!!!!!

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

  • 최종 클래스는 다른 클래스에서 확장할 수 없습니다.
  • 최종 변수는 다른 값을 재할당할 수 없습니다.
  • 최종 메서드는 재정의할 수 없습니다.

보안상의 이유로 클래스의 상속을 금지할 경우 최종이 중요한 시나리오 중 하나입니다.이를 통해 실행 인 코드를 다른 사용자가 재정의할 수 없도록 할 수 있습니다.

다른 를 위한 입니다. 즉 최적화입니다.자바 컴파일러는 최종 클래스로부터의 함수 호출을 인라인으로 하는 것으로 기억합니다.하면 '아까'라고 불러주세요.a.x() a는 가언선 and and and and and and and and라고 됩니다.final컴파일 시 코드가 무엇인지 알고 있으며 호출 함수에 인라인으로 연결할 수 있습니다.이것이 실제로 행해진 것인지 아닌지는 모르겠지만, 최종적으로는 가능성이 있다.

가장 좋은 예는

public final class 문자열

이 클래스는 불변의 클래스이며 확장할 수 없습니다.물론, 이 수업을 불변하게 만드는 것만이 아니다.

클래스 계층을 트리로 생각할 경우(Java에서와 같이), 추상 클래스는 분기만 될 수 있으며 최종 클래스는 리프만 될 수 있습니다.이러한 카테고리에 속하지 않는 클래스는 분기 및 리프 모두일 수 있습니다.

여기에는 OO의 원칙을 위반하는 것이 없으며, 최종은 단지 훌륭한 대칭을 제공합니다.

실제로는 오브젝트를 불변하게 하거나 API를 작성하는 경우 클래스가 확장을 의도하지 않았음을 API 사용자에게 알리기 위해 final을 사용합니다.

관련 판독치: 마틴의 열린 닫힘의 원칙.

주요 인용문:

소프트웨어 엔티티(클래스, 모듈, 기능 등)는 확장에 대해 열어야 하지만 수정에 대해서는 닫아야 합니다.

final키워드는 메서드 또는 클래스에서 사용되는 경우 모두 Java에서 이를 강제하는 수단입니다.

" " "final그 자체는 어떤 최종적인 것을 의미하며 어떤 식으로도 수정해서는 안 된다.가 「」라고 마크가 붙어 .final을 사용하다 는 왜 입니다.finalIMO를 사용법

  1. 표준화:일부 클래스는 표준 함수를 수행하며, 예를 들어 문자열 조작과 관련된 다양한 함수를 수행하는 클래스나 수학적 함수 등을 수정하는 것을 의도하지 않습니다.
  2. 보안상의 이유:때로는 다양한 인증 및 비밀번호 관련 기능을 수행하는 클래스를 작성하기도 하며, 다른 사람에 의해 변경되는 것을 원하지 않습니다.

클래스라고 요.final효율성을 향상시키지만 솔직히 나는 이 주장이 큰 무게를 가지고 있다는 것을 찾을 수 없었다.

자바가 객체 지향이고 클래스 파이널을 선언하면 객체의 특성을 갖는 클래스는 중지되지 않습니까?

아마도 그렇겠지, 하지만 가끔은 그게 의도된 목적일 수도 있어.때로는 이 클래스의 능력을 희생함으로써 보안 등의 큰 이점을 얻기 위해 그렇게 하기도 합니다.하지만 최종 수업은 필요할 경우 한 과목을 연장할 수 있습니다.

한편으로 우리는 상속보다 구성을 선호해야 한다.final키워드는 실제로 이 원칙을 적용하는 데 도움이 됩니다.

final class는 새로운 의 중단을 수 .

에서 과 같이 합니다.Base★★★★★★★★★★★★★★★★★★★:

public class Base {}

클라이언트는 다음 작업을 수행합니다.

class Derived extends Base {
    public int method() { return 1; }
}

2를 method to 는 methodBase:

class Base {
    public String method() { return null; }
}

클라이언트 코드가 깨질 수 있습니다.

final class Base대신 클라이언트는 상속할 수 없고 메서드를 추가해도 API가 중단되지 않습니다.

파이널 클래스는 연장할 수 없는 클래스입니다.또한 메서드는 하위 클래스에서 재정의할 수 없음을 나타내기 위해 final로 선언할 수 있습니다.

클래스가 하위 클래스로 분류되지 않도록 하는 것은 API 또는 라이브러리를 작성하고 기본 동작을 변경하도록 확장되는 것을 방지하려는 경우에 특히 유용합니다.

수업에서 기말고사를 할 때는 조심하세요.최종 클래스에 대해 단위 테스트를 작성하는 경우 Michael C에서 설명한 종속성 차단 기술 "Subclass and Override Method"를 사용하기 위해 이 최종 클래스를 서브클래스로 만들 수 없기 때문입니다.Featers의 책 "Legacy Code로 효과적으로 작동"이 책에서 페더스는 이렇게 말했다. "진지하게, 봉인된 최종적인 것은 잘못된 생각이고, 프로그래밍 언어에 추가되지 말았어야 했다고 믿기 쉽다.하지만 진짜 잘못은 우리에게 있다.우리가 통제할 수 없는 라이브러리에 직접 의존할 때는 그저 문제를 일으킬 뿐입니다.

java에서 final 키워드는 다음과 같은 경우에 사용합니다.

  1. 최종 변수
  2. 최종 방법
  3. 파이널 클래스

Java 최종 변수는 재할당할 수 없고 최종 클래스는 확장할 수 없으며 최종 메서드는 재정의할 수 없습니다.

가 「」라고 되어 있는 .final는 외부의어떤 수 에 띄는 을 할 class B extends A안 먹히네기본적으로 코드의 일부를 보호하는 방법입니다.

명확히 하기 위해, 수업 표시final필드를 로 표시하지 않습니다.final따라서 객체 속성이 아니라 실제 클래스 구조가 보호됩니다.

최종 클래스 문제에 대처하려면:

한 반을 기말고사로 만드는 방법은 두 가지가 있다.첫 번째 방법은 클래스 선언에서 final 키워드를 사용하는 것입니다.

public final class SomeClass {
  //  . . . Class contents
}

클래스를 최종화하는 두 번째 방법은 모든 컨스트럭터를 비공개로 선언하는 것입니다.

public class SomeClass {
  public final static SOME_INSTANCE = new SomeClass(5);
  private SomeClass(final int value) {
  }

결승으로 표시하면 실제 결승이라는 것을 알게 되었을 때 이 테스트 클래스를 살펴보기 위해 번거로움을 덜 수 있습니다.언뜻 보면 공공연해 보인다.

public class Test{
  private Test(Class beanClass, Class stopClass, int flags)
    throws Exception{
    //  . . . snip . . . 
  }
}

안타깝게도 클래스의 유일한 생성자가 개인이기 때문에 이 클래스를 확장하는 것은 불가능합니다.시험 수업의 경우, 수업이 기말고사여야 할 이유가 없습니다.테스트 클래스는 암묵적인 최종 클래스가 어떻게 문제를 일으킬 수 있는지를 보여주는 좋은 예입니다.

따라서 컨스트럭터를 비공개로 하여 암묵적으로 클래스를 최종화할 때는 최종 마크를 붙여야 합니다.

클래스를 최종으로 유지하는 장점 중 하나는 다음과 같습니다.

문자열 클래스는 최종 상태로 유지되므로 누구도 메서드를 재정의하고 기능을 변경할 수 없습니다.예를 들어 length() 메서드의 기능을 변경할 수 없습니다.항상 문자열의 길이를 반환합니다.

이 클래스의 개발자는 이 클래스의 기능을 변경하는 것을 원치 않았기 때문에 최종적인 것으로 했습니다.

네, 보안이나 속도상의 이유로 이 기능을 원할 수도 있습니다.C++에서도 가능합니다.프로그램에는 해당되지 않을 수 있지만 프레임워크에는 해당되지 않습니다.http://www.glenmccl.com/perfj_025.htm

FINAL을 "종말"로 생각해라. 그 남자는 더 이상 아이를 낳을 수 없다.이렇게 보면 클래스에 '줄 끝' 마커를 표시해야 하는 실제 시나리오가 많이 있습니다.도메인 기반 설계입니다. 지정된 ENTITY(클래스)가 하위 클래스를 만들 수 없도록 도메인이 요구하는 경우 FINAL로 표시합니다.

"최종 태그 지정" 클래스를 상속하는 것을 막을 수 없습니다.그러나 이는 일반적으로 "상속 남용"으로 분류되며, 대부분의 경우 클래스의 기본 클래스에서 일부 함수를 상속받기를 원하기 때문에 수행됩니다.

가장 좋은 방법은 도메인을 보고 설계 결정을 내리는 것입니다.

최종 클래스는 더 이상 연장할 수 없습니다.Java에서 클래스를 상속할 필요가 없는 경우 이 방법을 사용할 수 있습니다.

클래스에서 특정 메서드를 덮어쓰지 않아야 하는 경우 final 키워드를 그 앞에 두면 됩니다.그 클래스는 아직 상속할 수 있다.

다른 답변은 어떤 점에 중점을 두고 있습니다.final class컴파일러에 지시: 다른 클래스가 선언할 수 없도록 합니다.extends이 클래스와 그것이 바람직한 이유.

하지만 컴파일러만이 이 문구를 읽는 유일한 독자는 아니다.final class소스 코드를 읽는 모든 프로그래머도 읽습니다.빠른 프로그램 이해에 도움이 될 수 있습니다.

일반적으로 프로그래머가 본 경우Thing thing = that.someMethod(...);그리고 프로그래머는 다음 오브젝트의 동작을 이해하기를 원합니다.thingobject-reference, 프로그래머는 다음 사항을 고려해야 합니다.Thing클래스 계층: 여러 가지 유형이 있을 수 있으며 여러 패키지에 분산되어 있을 가능성이 있습니다.하지만 프로그래머가 알고 있거나 읽으면final class Thing파생 클래스가 없기 때문에 많은 Java 파일을 검색 및 학습할 필요가 없다는 것을 즉시 알 수 있습니다.공부만 하면 됩니다.Thing.java아마 기본 클래스일 겁니다.

최종 클래스는 확장할 수 없습니다.따라서 클래스가 특정 방식으로 동작하고 다른 사람이 메서드를 덮어쓰지 않도록 하려면(효율성이 떨어지고 악의적인 코드가 있을 수 있음) 클래스 전체를 변경하지 않는 최종 메서드 또는 특정 메서드로 선언할 수 있습니다.

클래스를 선언해도 클래스가 인스턴스화되지 않으므로 클래스가 개체의 특성을 갖는 것을 중지하는 것은 아닙니다.단지 수업시간에 선언된 방법을 고수해야 할 것이다.

전술한 바와 같이, 아무도 메서드의 기능을 변경할 수 없는 경우는, 최종이라고 선언할 수 있습니다.

예: 다운로드/업로드용 응용 프로그램서버 파일 경로, 오프셋에 따라 문자열을 분할합니다.이러한 메서드 함수는 변경되지 않도록 Final로 선언할 수 있습니다.이러한 최종 메서드를 별도의 클래스로 만들려면 해당 클래스를 Final 클래스로 정의합니다.따라서 Final 클래스는 모든 Final 메서드를 가지며, Final 메서드는 비 Final 클래스에서 선언하고 정의할 수 있습니다.

예를 들어서Employee메서드가 있는 클래스greet.가greet방법은 단순 인쇄라고 불린다Hello everyone!그럼 이게 우리가 예상한 행동입니다.greet방법

public class Employee {

    void greet() {
        System.out.println("Hello everyone!");
    }
}

자, 이제.GrumpyEmployee서브클래스Employee및 덮어쓰기greet방법은 다음과 같습니다.

public class GrumpyEmployee extends Employee {

    @Override
    void greet() {
        System.out.println("Get lost!");
    }
}

다음 코드에서는 다음 코드와sayHello방법.그것은 걸린다.Employeeinstance를 파라미터로 하여 greet 메서드를 호출합니다.그런데 여기서 얻을 수 있는 것은 입니다.이 동작의 변화는Employee grumpyEmployee = new GrumpyEmployee();

public class TestFinal {
    static Employee grumpyEmployee = new GrumpyEmployee();

    public static void main(String[] args) {
        TestFinal testFinal = new TestFinal();
        testFinal.sayHello(grumpyEmployee);
    }

    private void sayHello(Employee employee) {
        employee.greet(); //Here you would expect a warm greeting, but what you get is "Get lost!"
    }
}

이 상황은, 다음의 경우에 회피할 수 있습니다.Employee수업이 만들어졌다final건방진 프로그래머가 야기할 수 있는 혼란의 양을 상상해 보세요.String클래스가 다음과 같이 선언되지 않았습니다.final.

Android Looper 클래스가 그 좋은 실용적인 예입니다.http://developer.android.com/reference/android/os/Looper.html

Looper 클래스는 다른 클래스에서 오버라이드되지 않는 특정 기능을 제공합니다.따라서 여기에는 서브클래스가 없습니다.

실제로 알고 있는 사용 사례는 generated class뿐입니다.

생성된 클래스의 사용 사례 중 하나는 의존성 주입(https://github.com/google/dagger)입니다.

오브젝트 방향은 상속이 아니라 캡슐화에 관한 것입니다.그리고 상속은 캡슐화를 파괴합니다.

기말고사를 선언하는 것은 많은 경우에 완벽하게 말이 된다.색상이나 금액과 같은 "가치"를 나타내는 어떤 물체도 최종적일 수 있습니다.그들은 스스로 서 있다.

라이브러리를 작성할 경우 파생할 클래스를 명시적으로 들여쓰지 않는 한 클래스를 최종 클래스로 만듭니다.그렇지 않으면, 사람들이 당신의 클래스를 도출하고 당신의 가정/불변성을 깨면서 메서드를 덮어쓸 수 있습니다.이는 보안에도 영향을 미칠 수 있습니다.

"Effective Java"의 Jooshua Bloch는 상속을 위해 명시적으로 설계하거나 이를 금지할 것을 권장하며 상속을 위해 설계하는 것은 그리 쉽지 않다고 지적합니다.

언급URL : https://stackoverflow.com/questions/5181578/what-is-the-point-of-final-class-in-java

반응형