JavaRush /Java Blog /Random-KO /최종 Java 메소드 및 클래스
articles
레벨 15

최종 Java 메소드 및 클래스

Random-KO 그룹에 게시되었습니다
수정자로 클래스 메서드를 표시하면 final파생 클래스가 내부 구현을 변경하여 이 메서드를 재정의할 수 없음을 의미합니다. 즉, 우리는 메소드의 최종 버전에 대해 이야기하고 있습니다. 클래스 전체를 로 표시할 수도 있습니다 final. 최종 Java 메소드 및 클래스 - 1
final class NoExtending {
// …
}
로 표시된 클래스는 final상속될 수 없으며 해당 클래스의 모든 메서드는 간접적으로 속성을 획득합니다 final. 클래스 및 메서드 선언에 기능을 사용하면 final코드 보안 수준을 높일 수 있습니다. 클래스에 수정자가 장착되어 있으면 final누구도 클래스를 확장할 수 없으며 프로세스에서 계약을 위반할 수도 있습니다. 기호가 final메소드를 나타내는 경우 "위조"에 대한 두려움 없이 모든 상황에서 내부 구현을 완전히 신뢰할 수 있습니다. final예를 들어, 메서드가 원래 의도한 대로 정확하게 실행되는지 확인하기 위해 사용자가 입력한 비밀번호를 확인해야 하는 메서드 선언에 를 사용하는 것이 적합합니다 . 가능한 공격자는 재정의된 버전을 프로그램에 "미끄러넣어" 이러한 메서드의 원래 구현을 변경할 수 없습니다. 예를 들어 암호에 관계없이 사용자가 성공적으로 등록되었음을 나타내는 항상 true 값을 반환합니다. 그는 실제로 들어갔다. 특정 상황이 허용하는 경우 더 나아가 final전체 클래스를 클래스로 선언할 수 있는 권리가 있습니다. 메서드는 ValidatePassword동일한 속성을 간접적으로 획득합니다. 메서드 또는 클래스 선언에서 수정자를 사용하면 final코드의 추가 사용 및 개발 가능성에 심각한 제한이 적용됩니다. final선언에서 메소드를 사용하는 것은 메소드 구현이 자체 포함되어 있고 완전히 완료되었음을 나타내는 확실한 표시입니다. 귀하의 클래스를 사용하여 자신의 필요에 맞게 기능을 확장하려는 다른 프로그래머는 목표를 달성하기 위한 수단 선택이 제한되거나 완전히 박탈될 것입니다. final클래스를 전체적으로 표시하면 해당 클래스의 상속 기능이 비활성화되고 다른 사용자에 대한 유용성이 크게 줄어들 수 있습니다. 수식어를 사용하려고 할 때 final그러한 희생을 감수할 준비가 되었는지, 희생할 가치가 있는지 확인하십시오. 많은 경우, 충분한 수준의 코드 보안을 달성하기 위해 전체 클래스를 다음과 같이 지정할 필요는 없습니다. "중요한" 구조 요소만 수정자로 final표시하여 클래스의 확장성을 보존하는 것이 가능합니다 . final이 경우 클래스의 주요 기능은 그대로 두고 동시에 새 멤버를 추가하여 상속을 허용하지만 "이전" 멤버를 재정의하지 않습니다. 물론, 메서드 코드에서 액세스하는 필드는 다음 중 final하나로 지정되어야 합니다 . 그렇지 않으면 파생된 클래스가 내용을 변경하여 해당 메서드의 동작에 영향을 미칠 수 있기 때문입니다. 수정자를 사용하는 또 다른 효과는 컴파일러가 해결한 코드 최적화 문제를 단순화하는 것과 관련됩니다. 다음으로 표시되지 않은 메소드가 호출될 때 발생하는 상황입니다.finalprivatefinalfinal, 런타임 시스템은 개체의 실제 클래스를 결정하고 오버로드된 메서드 그룹에서 가장 적절한 코드와 호출을 연결한 다음 해당 코드로 제어를 전송합니다. getName그러나 예를 들어 앞에서 설명한 클래스 예제의 메서드를 Attr로 지정했다면 final해당 메서드를 호출하는 작업이 눈에 띄게 단순화되었을 수 있습니다. 와 관련된 경우와 같이 가장 사소한 경우에 getName컴파일러는 간단히 메서드 호출을 해당 본문 코드로 바꿀 수 있습니다. 이 메커니즘을 코드 인라인이라고 합니다. 인라인 버전의 메서드를 사용하는 경우 getName다음 두 표현식은 정확히 동일하게 실행됩니다.
system.out.println("id = " + rose.name);
system.out.println("id = " + rose.getName());
위의 표현식은 동일하지만 두 번째 표현식은 여전히 ​​장점이 있습니다. 이 메소드를 사용하면 getName이름 필드에 읽기 전용 속성을 부여할 수 있고 클래스 코드에 특정 수준의 추상화가 가능해 더 자유롭게 변경할 수 있기 때문입니다. 클래스 구현. 컴파일러는 재정의를 허용하지 않으므로 동일한 최적화 방식을 private및 메서드에 적용할 수 있습니다. statiс클래스 선언에 수정자를 사용하면 final일부 유형 검사 작업이 더 효율적이 됩니다. 이 경우 이러한 많은 작업은 이미 컴파일 단계에서 수행될 수 있으므로 잠재적인 오류가 훨씬 더 일찍 감지됩니다. 컴파일러가 소스 텍스트에서 클래스에 대한 참조를 발견하면 final해당 객체가 지정된 유형인지 "확실"할 수 있습니다. 컴파일러는 전체 클래스 계층 구조에서 클래스가 차지하는 위치를 즉시 판단하고 올바르게 사용되는지 여부를 확인할 수 있습니다. 수정자가 final적용되지 않으면 해당 검사는 프로그램 실행 단계에서만 수행됩니다. 연습 3.4. vehicle 및 승객vehicle 클래스의 메서드 선언에 최종 수정자를 포함하는 것이 바람직합니까? 그렇다면 어느 것입니까 ? 원본 소스 링크: http://src-code.net/metody-i-klassy-final-java
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION