클래스에 대한 액세스를 제한해야하는 상황이 있습니다. 더 정교한에, 나는 두 개의 클래스, 말을 A
하고 B
클래스에 따라 그 C
,하지만 A
의 전체 인터페이스를 사용할 필요가 없습니다 C
같은가 간다 B
. 내가 한 것은 C
두 개의 다른 인터페이스를 구현하는 것입니다. 하나 A
는 액세스 할 수 있고 다른 하나는 B
참조 할 수 있습니다. 내가 여기서하는 일이 맞습니까? 아니면 그냥 문서화해야합니까? 아니면 더 나은 접근 방법이 있습니까?
더 많은 컨텍스트를 제공하기 위해 플러그인 인터페이스를 허용하는 시스템을 구현하려고합니다. 그리고 누군가가 내가 원하지 않는 클래스의 일부에 액세스하는 것을 원하지 않습니다.
디자인에 문제가 없습니다. 그러나 디자인의 이유는 보안이 아닌 명확한 디자인이어야합니다. 점을 감안 A
와 B
클래스에 액세스 할 수 있습니다 C
(있기 때문에, 예를 들어 C
그들은 단지 그들에받는 객체 캐스트 할 수 있습니다 : 그들은 전체에 전체 개체에 액세스 할 수 공개) C
다음 액세스를 :
public interface IA {
void f();
}
public interface IB {
void g();
}
public class C implements IA, IB {
public void f() { ... }
public void g() { ... }
}
public class A {
public void doSomething(IA anIA) {
C aC = (C) anIA;
aC.g(); // legal!
}
}
이것은 당신의 프로그래머이기 때문에, 종종 문제가되지 않습니다 A
, B
그리고 C
. 자신을 신뢰하므로 명확한 디자인이 필요하지만 보안은 필요하지 않습니다.
경우에도 C
공공 및하지 A
와 B
직접 클래스를 액세스 할 수 없습니다, 그들은 여전히 반사를 사용 할 수 있습니다.
따라서 A
및을 신뢰할 수없는 경우 B
외부 당사자 (예 : 플러그인)에 의해 프로그래밍 되었기 때문에이 디자인을 사용할 수 없습니다. 플러그인이 액세스하기를 원하는 인터페이스 만 구현하는 객체를 보내야합니다.
public class C {
public void f() { ... }
public void g() { ... }
public IA getAsIO() {
return new IA() {
public void f() {
C.this.f();
}
};
}
public IB getAsIB() {
// similar
}
}
public class A {
public void doSomething(IA anIA) {
C aC = (C) anIA; // illegal
aC.g();
}
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다