[java] 인터페이스 변수가 기본적으로 정적 및 최종적인 이유는 무엇입니까?

Java에서 인터페이스 변수가 기본적으로 정적 및 최종적인 이유는 무엇입니까?



답변

Philip Shaw의 Java 인터페이스 디자인 FAQ에서 :

Java 인터페이스는 자체적으로 인스턴스화 할 수 없으므로 인터페이스 변수는 정적입니다. 변수의 값은 인스턴스가 존재하지 않는 정적 컨텍스트에서 할당되어야합니다. 최종 수정자는 인터페이스 변수에 지정된 값이 프로그램 코드로 재 할당 할 수없는 진정한 상수인지 확인합니다.

출처


답변

인터페이스에는 직접적인 객체가 없으므로 클래스 / 인터페이스를 사용하는 것이 유일한 방법입니다. 따라서 인터페이스 변수가 존재하는 경우 정적이어야합니다. 그렇지 않으면 외부 세계에 전혀 액세스 할 수 없습니다. 정적이기 때문에 하나의 값만 가질 수 있으며 구현하는 모든 클래스는 값을 변경할 수 있으므로 모든 엉망이 될 것입니다.

따라서 인터페이스 변수가 있으면 암시 적으로 정적이며 최종적이며 명백하게 공개됩니다!


답변

public : 인터페이스에 존재하는 메소드와 마찬가지로 모든 클래스의 액세스 가능성

static : interface는 객체를 가질 수 없으므로 interfaceName.variableName을 사용하여이를 참조하거나이를 구현하는 클래스에서 variableName을 직접 사용할 수 있습니다.

final : 상수로 만듭니다. 두 클래스가 동일한 인터페이스를 구현하고 둘 다 값을 변경할 권한을 부여하면 var의 현재 값에서 충돌이 발생하므로 한 번만 초기화가 허용됩니다.

또한 이러한 모든 수정자는 인터페이스에 암시 적이므로 실제로 지정할 필요는 없습니다.


답변

( 이것은 철학적 인 대답이 아니라 실용적인 것입니다 ). static다른 사람들이 대답 한 수정 자 요구 사항 은 분명합니다. 기본적으로 인터페이스를 인스턴스화 할 수 없으므로 해당 필드에 액세스하는 유일한 방법은 인터페이스를 클래스 필드로 만드는 것 static입니다.

interface필드 뒤에서 자동으로 final(일정하게) 되는 이유 는 다른 구현이 우연히 다른 구현의 동작에 영향을 줄 수있는 인터페이스 변수의 값을 실수로 변경하는 것을 방지하기위한 것입니다. 자바 interface가 속성을 명시 적으로 만들지 않은 아래 시나리오를 상상해보십시오 final.

public interface Actionable {
    public static boolean isActionable = false;

    public void performAction();
}

public NuclearAction implements Actionable {

    public void performAction() {
        // Code that depends on isActionable variable
        if (isActionable) {
            // Launch nuclear weapon!!!
        }
    }
}

이제 구현하는 다른 클래스가 Actionable인터페이스 변수의 상태를 변경하면 어떻게 될지 생각해보십시오 .

public CleanAction implements Actionable  {

    public void performAction() {
        // Code that can alter isActionable state since it is not constant
        isActionable = true;
    }
}

이러한 클래스는 클래스 로더에 의해 단일 JVM 내에로드 된 경우의 동작을 NuclearAction다른 클래스에 의해 영향을받을 수는 CleanAction, 그 때 performAction()뒤에있는 invoke이다 CleanAction의 최악이 경우 어떤 일 수있다 (그렇지 않으면 동일한 스레드 또는) 실행 (의미 적으로 그것은)입니다.

각 구현에서 interface이러한 변수를 어떻게 사용할지 알 수 없으므로 암시 적으로이어야합니다 final.


답변

다른 것은 구현의 일부이므로 인터페이스에는 구현이 포함될 수 없습니다.


답변

public interface A{
    int x=65;
}
public interface B{
    int x=66;
}
public class D implements A,B {
    public static void main(String[] a){
        System.out.println(x); // which x?
    }
}

해결책은 다음과 같습니다.

System.out.println(A.x); // done

인터페이스 변수가 정적 인 이유 중 하나라고 생각합니다.

인터페이스 내에서 변수를 선언하지 마십시오.


답변

static-인터페이스는 인스턴스를 가질 수 없기 때문입니다. 마지막으로 변경할 필요가 없기 때문입니다.