programing

인터페이스 메서드의 마지막 인수 - 요점이 무엇입니까?

firstcheck 2022. 7. 23. 12:10
반응형

인터페이스 메서드의 마지막 인수 - 요점이 무엇입니까?

자바에서는 다음 명령어를 정의하는 것이 완전히 합법적입니다.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. finalinterface) 인수 구현에서는 할 수 ) 또는 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콜리플라워는 원래 있던 냄비가 아닌 새로운 지역 요리냄비에 추가됐기 때문에 잃어버렸습니다.

콩 : 오브젝트와 같은 개념입니다(위 그림 참조).콩은 본질적으로ObjectJavas(Java.s)에서는 단, 콩)은 정의하기 위한 편리에서 사용됩니다.★★★★★★★★★★★★★★와 같이addVegetables 냄비를 과정을 수 StringBuilder콜리플라워와 함께 버리면 조리 냄비 JavaBean에도 똑같이 할 수 있습니다.

최종인지 아닌지는 구현 세부사항이기 때문에 불필요한 세부사항이라고 생각합니다.

(인터페이스 내의 메서드 또는 멤버를 퍼블릭으로 선언하는 것과 같은 종류).

언급URL : https://stackoverflow.com/questions/5380177/final-arguments-in-interface-methods-whats-the-point

반응형