인터페이스 메서드의 마지막 인수 - 요점이 무엇입니까?
자바에서는 다음 명령어를 정의하는 것이 완전히 합법적입니다.final
예를 들어 다음과 같이 구현 클래스의 인수를 따르지 않습니다.
public interface Foo {
public void foo(int bar, final int baz);
}
public class FooImpl implements Foo {
@Override
public void foo(final int bar, int baz) {
...
}
}
위의 예에서는bar
그리고.baz
정반대의 것을 가지다final
클래스 내의 정의와 인터페이스의 정의입니다.
같은 방법으로, 아니다.final
한 클래스 메서드가 다른 클래스 메서드를 확장하면 제한이 적용됩니다.abstract
그렇지 않으면.
하는 동안에final
클래스 메서드 본문 내에 몇 가지 실용적인 가치가 있습니다.지정할 포인트가 있나요?final
인터페이스 방식 파라미터의 경우
아무 의미도 없는 것 같아요.Java Language Specification 4.12.4에 따르면:
변수 final을 선언하면 값이 변경되지 않고 프로그래밍 오류를 방지하는 데 도움이 되는 유용한 문서가 될 수 있습니다.
단, a.final
메서드 파라미터의 수식자는 오버라이드된 메서드의 시그니처를 대조하는 규칙에는 기재되어 있지 않습니다.또, 발신자에게는 영향을 주지 않습니다.실장 본문 내에만 해당됩니다.또한, 로빈이 코멘트에서 언급했듯이,final
메서드 파라미터의 수식자는 생성된 바이트코드에 영향을 주지 않습니다.(이것은, 의 다른 용도에는 해당되지 않습니다.final
.)
일부 IDE는 구현 메서드를 하위 클래스에 삽입할 때 추상/인터페이스 메서드의 서명을 복사합니다.
컴파일러에 전혀 영향을 주지 않는다고 생각합니다.
편집: 과거에는 이것이 사실이었다고 믿었지만, 현재 IDE에서는 더 이상 그렇게 하지 않는 것 같습니다.
메서드 파라미터의 최종주석은 항상 발신자에 대한 메서드 구현에만 관련이 있습니다.따라서 인터페이스 방식 시그니처에 이러한 시그니처를 사용할 실질적인 이유는 없습니다.모든 방법 서명에서 최종 방법 매개변수가 필요한 동일한 일관된 코드화 표준을 따르기를 원하지 않는 한.그렇다면 그렇게 할 수 있어서 좋다.
업데이트: 아래 답변은 질문을 완전히 이해하지 못한 채 작성되었기 때문에 질문에 직접 대응하지 않습니다.:)
그럼에도 불구하고, 이것은 일반적인 용도를 이해하고자 하는 사람들에게 유익해야 한다.final
키워드를 지정합니다.
질문입니다만, 아래에서 제 코멘트를 인용하고 싶습니다.
나는 당신이 주장의 최종성을 실행하도록 강요받지 않는다고 믿는다. 그것은 당신 자신의 실행에 있어서 최종적인지 아닌지를 자유롭게 결정할 수 있도록 하기 위해서다.
할 수 게 좀요.
final
구현에서는 최종적이지 않은 것으로 합니다.다음 중 하나를 선택한다면 더 의미가 있을 것입니다.a.
final
interface) 인수 구현에서는 할 수 ) 또는 interface(interface)의 method 인수에는 할 수 .
b. 로서 주장을 선언하는 것final
로 「CHANGE」, 「CHANGE」라고 됩니다.final
( 「 」 、 「 」 、 「 」
메서드 시그니처가 다음과 같은 두 가지 이유를 생각할 수 있습니다.final
파라미터: Beans and Objects (실제로 둘 다 같은 이유이지만 컨텍스트가 약간 다릅니다)
오브젝트:
public static void main(String[] args) {
StringBuilder cookingPot = new StringBuilder("Water ");
addVegetables(cookingPot);
addChicken(cookingPot);
System.out.println(cookingPot.toString());
// ^--- OUTPUT IS: Water Carrot Broccoli Chicken ChickenBroth
// We forgot to add cauliflower. It went into the wrong pot.
}
private static void addVegetables(StringBuilder cookingPot) {
cookingPot.append("Carrot ");
cookingPot.append("Broccoli ");
cookingPot = new StringBuilder(cookingPot.toString());
// ^--- Assignment allowed...
cookingPot.append("Cauliflower ");
}
private static void addChicken(final StringBuilder cookingPot) {
cookingPot.append("Chicken ");
//cookingPot = new StringBuilder(cookingPot.toString());
// ^---- COMPILATION ERROR! It is final.
cookingPot.append("ChickenBroth ");
}
final
새로운 로컬 조리 냄비를 생성하려고 했을 때 컴파일 오류를 표시하여 실수로 생성하지 않도록 합니다.이것은 닭고기 육수가 우리의 원래 요리 냄비에 첨가되는 것을 확실히 했습니다.addChicken
이치노을 「」와 비교해 .addVegetables
콜리플라워는 원래 있던 냄비가 아닌 새로운 지역 요리냄비에 추가됐기 때문에 잃어버렸습니다.
콩 : 오브젝트와 같은 개념입니다(위 그림 참조).콩은 본질적으로Object
Javas(Java.s)에서는 단, 콩)은 정의된 및하기 위한 편리한 에서 사용됩니다.★★★★★★★★★★★★★★와 같이addVegetables
냄비를 과정을 수 StringBuilder
콜리플라워와 함께 버리면 조리 냄비 JavaBean에도 똑같이 할 수 있습니다.
최종인지 아닌지는 구현 세부사항이기 때문에 불필요한 세부사항이라고 생각합니다.
(인터페이스 내의 메서드 또는 멤버를 퍼블릭으로 선언하는 것과 같은 종류).
언급URL : https://stackoverflow.com/questions/5380177/final-arguments-in-interface-methods-whats-the-point
'programing' 카테고리의 다른 글
Nuxt: 명령 'nuxt'를 찾을 수 없음 - 출력 디렉터리 'dist/'이(가) 없습니다. (0) | 2022.07.24 |
---|---|
null-terminator로 끝나는 문자열 리터럴에는 여분의 null-terminator가 포함되어 있습니까? (0) | 2022.07.23 |
Java 날짜 비교 방법 (0) | 2022.07.23 |
vue.js의 데이터에서 메서드를 호출하려면 어떻게 해야 합니까? (0) | 2022.07.23 |
Eclipse에서 디버깅하는 동안 전체 문자열 보기 (0) | 2022.07.23 |