인터페이스에서 사용되는 변수가 PUBLIC STATIC FINAL 인 이유는 무엇입니까? 특히 "정적"인 이유는 무엇입니까?인터페이스의 변수
답변
인터페이스에서 선언 된 필드는 어쨌든 상수 일 수 있습니다. 따라서 어떤 인스턴스를 사용하여 액세스 할 수 있습니까?
요즘에는 필드를 인터페이스에 넣는 것이 좋지 않은 스타일입니다. 인터페이스는 그것을 구현하는 클래스의 기능을 반영하기위한 것이고 상수 아이디어와 완전히 직교합니다. 인터페이스 을 사용하여 단지을 사용하여 많은 수의 상수를 선언하는 것은 확실히 불쾌한 생각입니다. 가끔 인터페이스 유형이 간단한 구현 인 상수를 노출하게하는 것이 유용하다는 것을 알 수 있습니다. 따라서 필터링 인터페이스에는 "ALLOW_ALL"및 "ALLOW_NONE"필드가있을 수 있습니다.
나는 실제로 클래스 인스턴스 필드를 추가 않았다 인터페이스 를 구현 어디 시나리오의을 생각할 수도있을 것 같군요 -하지만 그뿐만 아니라 일부를 지정하여뿐만 아니라 암시 적으로 공개되는 그것의 측면에서 캡슐을 깰 것 구현 대신에 API가 필요합니다.
정적 상수 매개 변수는 요즘에는 어쨌든 전체적으로 좋지 않습니다. 상수를 묶어서 Enum으로 바꾸는 것이 현재 적절한 Java 방식입니다. 형식이 매우 안전하고 스위치로 작동하며 반복적으로 피하는 하나의 상수에 여러 값을 포함하도록 코딩 할 수 있습니다 마법의 숫자. – Esko
@Jon Skeet Great ..하지만 실제로 구현하지 못했습니다! – Sandeep
@Esko : Enum은 일부 * 경우에는 적합하지만 상수를 원할 때마다 * 모든 케이스를 다루지는 않습니다. 특히 열거 형은 고정 값 집합이있는 경우에만 적합합니다. 예를 들어 UTF-8과 다른 보증 된 Charsets에 대해 Charset "상수"를 사용하는 것이 좋겠지 만 열거 형으로 만들고 싶지는 않습니다. 열거 형 망치를 가지고 있기 때문에 모든 것을 못처럼 보이게하려고하지 마십시오. :) –
인터페이스를 인스턴스화 할 수 없기 때문에. 또한 정적이 아닌 비 최종 변수를 사용하는 메서드 본문이있을 수 없습니다.
내가 추측하는 주요 이유는 VM/언어의 구현 세부 사항입니다.
인터페이스에 비 정적 변수가 허용되지 않으면 클래스를 만들 때 인터페이스에 메모리를 할당 할 필요가 없습니다. 또한 같은 이름의 변수를 상속받을 경우를 대비하여 특별한 명명/이름 변경 메커니즘이 필요하지 않습니다. 필요한 것은 인터페이스가 사용될 때 올바른 함수를 호출하는 테이블입니다.
간단히 말해서 언어/VM 관리자의 생활을 더 쉽게 만듭니다. 다중 상속과 함정 및 함정을 실제로보고 싶다면 Bertrand Meyer (제 2 판)의 Object Oriented Software Construction을 읽어보십시오. 그렇다면 인터페이스가 왜 그렇게 단순해야하는지 (그리고 다중 상속이하는 대부분의 것들을 보관해야하는 이유)을 이해할 수 있습니다.
인터페이스는 객체 간의 상호 작용을 정의 계약이다.
이 상호 작용은 변수가 아니라 노출 된 메소드에 의해 정의됩니다. 변수는 상호 작용이 아니라 내부 작업 만 기술합니다.
상호 작용을 위해 변수를 사용해서는 안됩니다. 캡슐화의 OOP 원칙에 따르면, 1 클래스가 다른 클래스의 변수에 직접 액세스하게하는 것은 범죄입니다.
상수 (예 : Math.PI
) 만 예외입니다. 의 정수는 캡슐화 원칙을 위반하지 않고 다른 클래스에서 직접 액세스 할 수있는 유일한 종류의 변수이므로 인터페이스의 모든 변수는 public static final
변수로 처리됩니다.상수)
- 1. 인터페이스의 문제점
- 2. 인터페이스의 속성
- 3. 인터페이스의 일반 목록
- 4. IDictionary 인터페이스의 용도
- 5. 인터페이스의 메소드가 예외를 발생시켜야합니까?
- 6. C++ 인터페이스의 개인 메소드?
- 7. 마커 인터페이스의 목적은 무엇입니까?
- 8. 팩토리가 인터페이스의 구현을 반환하나요?
- 9. 브릿지와 인터페이스의 차이점
- 10. Java 인터페이스의 선택적 메소드
- 11. 인터페이스의 순수 가상 소멸자
- 12. Ninject에서 인터페이스의 배열 삽입
- 13. 인터페이스의 IP 주소를 얻으십시오
- 14. ** Set 인터페이스의 ** equals **
- 15. 인터페이스의 대리인 및 이벤트?
- 16. 인터페이스의 파생 의미는 무엇입니까?
- 17. 스타일링 GWT 인터페이스의 어려움
- 18. 인터페이스의 메소드 가시성
- 19. Zope 인터페이스의 목적은 무엇입니까?
- 20. 인터페이스의 생성자 메서드
- 21. 인터페이스의 열거 형 스텁?
- 22. 인터페이스의 가치는 무엇입니까?
- 23. 사용자 인터페이스의 날짜 표시
- 24. 인터페이스의 필요성, 고유 프로젝트의 주입
- 25. C 인터페이스의 핸들에 적합한 유형
- 26. 추상 클래스와 인터페이스의 차이점은 무엇입니까?
- 27. 장고 관리 인터페이스의 추가 필드
- 28. WCF : 일반 인터페이스의 직렬화가 가능합니까?
- 29. 인터페이스의 속성/멤버 변수는 무엇입니까?
- 30. 추상 클래스보다 인터페이스의 장점은 무엇입니까?
필자는 잠시 동안 myInterface와 같은 인터페이스 변수를 만드는 것이 더 좋습니다. myVarible = new myInterface(); 길을 유지하는 것이 더 쉽기 때문에 수업을 사용하는 것보다. 어떻게 될까요? –
[가능한 이유는 인터페이스 변수가 정적이고 기본적으로 최종입니까?] (http://stackoverflow.com/questions/2430756/why-are-interface-variables-static-and-final-by-default) – Line