2009-12-07 8 views
8

인터페이스에서 사용되는 변수가 PUBLIC STATIC FINAL 인 이유는 무엇입니까? 특히 "정적"인 이유는 무엇입니까?인터페이스의 변수

+0

필자는 잠시 동안 myInterface와 같은 인터페이스 변수를 만드는 것이 더 좋습니다. myVarible = new myInterface(); 길을 유지하는 것이 더 쉽기 때문에 수업을 사용하는 것보다. 어떻게 될까요? –

+0

[가능한 이유는 인터페이스 변수가 정적이고 기본적으로 최종입니까?] (http://stackoverflow.com/questions/2430756/why-are-interface-variables-static-and-final-by-default) – Line

답변

20

인터페이스에서 선언 된 필드는 어쨌든 상수 일 수 있습니다. 따라서 어떤 인스턴스를 사용하여 액세스 할 수 있습니까?

요즘에는 필드를 인터페이스에 넣는 것이 좋지 않은 스타일입니다. 인터페이스는 그것을 구현하는 클래스의 기능을 반영하기위한 것이고 상수 아이디어와 완전히 직교합니다. 인터페이스 을 사용하여 단지을 사용하여 많은 수의 상수를 선언하는 것은 확실히 불쾌한 생각입니다. 가끔 인터페이스 유형이 간단한 구현 인 상수를 노출하게하는 것이 유용하다는 것을 알 수 있습니다. 따라서 필터링 인터페이스에는 "ALLOW_ALL"및 "ALLOW_NONE"필드가있을 수 있습니다.

나는 실제로 클래스 인스턴스 필드를 추가 않았다 인터페이스 를 구현 어디 시나리오의을 생각할 수도있을 것 같군요 -하지만 그뿐만 아니라 일부를 지정하여뿐만 아니라 암시 적으로 공개되는 그것의 측면에서 캡슐을 깰 것 구현 대신에 API가 필요합니다.

+3

정적 상수 매개 변수는 요즘에는 어쨌든 전체적으로 좋지 않습니다. 상수를 묶어서 Enum으로 바꾸는 것이 현재 적절한 Java 방식입니다. 형식이 매우 안전하고 스위치로 작동하며 반복적으로 피하는 하나의 상수에 여러 값을 포함하도록 코딩 할 수 있습니다 마법의 숫자. – Esko

+0

@Jon Skeet Great ..하지만 실제로 구현하지 못했습니다! – Sandeep

+0

@Esko : Enum은 일부 * 경우에는 적합하지만 상수를 원할 때마다 * 모든 케이스를 다루지는 않습니다. 특히 열거 형은 고정 값 집합이있는 경우에만 적합합니다. 예를 들어 UTF-8과 다른 보증 된 Charsets에 대해 Charset "상수"를 사용하는 것이 좋겠지 만 열거 형으로 만들고 싶지는 않습니다. 열거 형 망치를 가지고 있기 때문에 모든 것을 못처럼 보이게하려고하지 마십시오. :) –

6

인터페이스를 인스턴스화 할 수 없기 때문에. 또한 정적이 아닌 비 최종 변수를 사용하는 메서드 본문이있을 수 없습니다.

3

왜 정적이지 않습니까?

인터페이스의 특정 인스턴스가 아닌 인터페이스와 관련된 상수입니다.

+0

추상 클래스 인스턴스가있을 수 있습니까? – UnKnown

3

내가 추측하는 주요 이유는 VM/언어의 구현 세부 사항입니다.

인터페이스에 비 정적 변수가 허용되지 않으면 클래스를 만들 때 인터페이스에 메모리를 할당 할 필요가 없습니다. 또한 같은 이름의 변수를 상속받을 경우를 대비하여 특별한 명명/이름 변경 메커니즘이 필요하지 않습니다. 필요한 것은 인터페이스가 사용될 때 올바른 함수를 호출하는 테이블입니다.

간단히 말해서 언어/VM 관리자의 생활을 더 쉽게 만듭니다. 다중 상속과 함정 및 함정을 실제로보고 싶다면 Bertrand Meyer (제 2 판)의 Object Oriented Software Construction을 읽어보십시오. 그렇다면 인터페이스가 왜 그렇게 단순해야하는지 (그리고 다중 상속이하는 대부분의 것들을 보관해야하는 이유)을 이해할 수 있습니다.

2

인터페이스는 객체 간의 상호 작용을 정의 계약이다.

이 상호 작용은 변수가 아니라 노출 된 메소드에 의해 정의됩니다. 변수는 상호 작용이 아니라 내부 작업 만 기술합니다.

상호 작용을 위해 변수를 사용해서는 안됩니다. 캡슐화의 OOP 원칙에 따르면, 1 클래스가 다른 클래스의 변수에 직접 액세스하게하는 것은 범죄입니다.

상수 (예 : Math.PI) 만 예외입니다. 의 정수는 캡슐화 원칙을 위반하지 않고 다른 클래스에서 직접 액세스 할 수있는 유일한 종류의 변수이므로 인터페이스의 모든 변수는 public static final 변수로 처리됩니다.상수)

관련 문제