2012-01-28 4 views
19

가능한 중복 : 나는 인터페이스의 메소드를 보호 왜 캔트 자바에서
Protected in Interfaces왜 인터페이스가 보호하지 수있는 방법

? 필드 또는 동일한 패키지에 모든 유형의 액세스 방법에있어서, 임의의 패키지에 서브 -

자바 규격에 (보호 키워드로 표시)

보호 액세스있어서입니다.

인터페이스를 사용해야하는 경우이를 구현하고 메서드를 재정의 할 것입니다. 그래서 클래스가 해당 메소드에 액세스 할 수있는 곳을 구현하려고한다면 메소드는 모든 패키지에서 액세스 할 수 있으므로 구현하려고합니다. 그래서 인터페이스에서 보호 된 메서드를 선언 할 때 발생하는 해악은 무엇입니까?

+4

아주 좋은 질문을 정의 할 때 구현 생각하지 않습니다. 자바의 거의 모든 다른 것들에 대해서 나는 선택에 대한 진정한 이유를 발견했지만,이 것에 대해서는 그렇지 않다. 인터페이스에 보호 된 메서드를 정의하는 것이 나에게 완벽하다.이 메서드는 동일한 패키지 내의 다른 클래스가 해당 메서드를 노출하지 않고도 구현하는 개체에서이 메서드를 사용할 수있게합니다.이 메서드는 해당 메서드를 노출하지 않아도됩니다. 패키지 회원들과 함께 –

+0

@ MarkusA., +1, http://stackoverflow.com/questions/5376970/protected-in-interfaces#comment-39795200 – Pacerier

답변

11

보호 방법은 서브 클래스로 구현 공유를위한 것입니다. 인터페이스는 구현이 전혀 없기 때문에 구현 공유가 이루어질 때까지는 제공 할 것이 없습니다. 따라서 인터페이스의 모든 메소드는 public이어야합니다.

+24

여기에서 여러분의 요지를 이해하지만, 인터페이스의'public' 메소드는 구현 클래스가 나머지 메소드들과 그 메소드를 공유하도록 강요하지 않습니까? 인터페이스가 API의 내부를 더 모듈화되게 만드는 데 사용되는 경우 개발자가 갑자기 내부 구조를 외부 세계에 공개하려고한다는 것을 의미하지는 않습니다. 이 제한으로 구현이 있고'package-protected' (기본값)로 의도 된 메소드는 그것이 준수하고있는'인터페이스 '때문에'public'이되어야합니다. 그러므로 'protected'에 대해 이해가 되긴하지만,'default'를위한 것 같지 않습니다 – jbx

+1

@jbx 맞습니다 - 패키지 - 개인 인터페이스는 흥미로운 문제를 만듭니다. 그러나 패키지 개인 인터페이스가 패키지 개인 인터페이스의 구현을 제공하도록 허용함으로써 컴파일러 수준에서 해결할 수 있다고 생각합니다. – dasblinkenlight

+1

사실 나는 인터페이스 자체가 패키지 전용이 될 수 있다고 생각합니다. 따라서 실제로이 제한이하는 일은 모두 또는 전혀 접근하지 않는 것입니다. 'public' 메소드의 절반을 패키지로 보호 할 수는 없습니다. 당신은 모든 메소드를 가진'interface'를 볼 수 있습니다. 그렇지 않을 수도 있습니다. 어쩌면 모든 위력있는 제작자가 의도 한 것일 수도 있습니다. :) 그러나 어쨌든 위의 문제가 발생합니다. 패키지로 보호 된'인터페이스 '를 구현하는'public' 클래스는'public' 인터페이스를 구현하는 메소드를 갖게 될 것입니다. – jbx

-1

유해 여부는 중요하지 않습니다. 컴파일러가 그것을 허용하지 않는다면 당신의 요점은 문제가됩니다. 언어 설계자는 모두 공개로 요구하기로 결정 했으므로 많은 코드를 변경하지 않고도 지금은 변경할 수 없습니다.

+0

참조하십시오. 그것은 다를 수있었습니다. 어떤면에서, 우정 메커니즘은 인터페이스에서 메소드를 보호하는 것에 가깝습니다. 이는 계약을 정의하는 다소 방법 일뿐 아니라 계약에 의존 할 수있는 사람들을 제한하는 방법이기도합니다. 하지만 자바에서 공용 인터페이스 만 허용하도록 인터페이스가 설계되었으며 지금까지는 자바 프로그래머 커뮤니티가 항상이 상황에 대한 해결책을 찾았고 자바는 우리가 할 수있는 가장 큰 일들 중 일부를 성취 할 수있게했습니다 IT ... 거의 프로그램을 만들 수있는 깨끗한 방법을 제공합니다. – Snicolas

+2

Coulda, woulda, shoulda - 세상이 바뀝니다. 아직 완벽한 소프트웨어를 작성하지 못했습니다. 그리고 저는 이것을이 언어의 치명적인 결함으로 보지 않습니다. 나는 그것이 큰 일임에 동의하지 않는다. – duffymo

+1

사실, 나는 해로울 것이 무엇인지 매우 흥미로운 질문을 발견했다.Java 디자이너가 만든 다른 모든 결정에 대해서는 논리적 인 이유가 있습니다. http://stackoverflow.com/questions/197190/why-cant-i-use-a-type-argument-in-a-type-parameter-with-multiple-bounds와 같은 복잡한 항목 (두 번째 항목의 지점 2 참조) 대답). 이건 아니야. –

5

개체의 인터페이스는 해당 개체의 외부 사용자가 볼 수있는 개체입니다. 반대로 protected 및 private 메서드 (및 필드)는 내부 클래스에 속합니다. 그것들은 클래스 안에 캡슐화되어 있으며 클래스 사용자는 그것들을 인식해서는 안됩니다.

그래서, interface 이후 (웃기려는 의도 없음) 인터페이스를 정의하는 데 사용됩니다, 그들이 보호 방법을 포함하지 않는 것이 합리적이다.

하나는 interface

관련 문제