문제

이 질문은 이미 여기에 답이 있습니다.

좋아, 우정이 캡슐화가 캡슐화되는지에 대한 논쟁을 남기고 실제로 일관된 디자인을 우아하게 생각해 봅시다. 두 배의 기능입니다.

1) 구현 방법에 대한 일반적인 질문 :

   public class A 
   {
      friend class B;
   }

2)이 기능이 필요한 이유는 무엇입니까? 내 클래스 중 일부는 직렬화 가능한 인터페이스를 구현합니다. 그러나 파생 클래스에서 직렬화 가능한 메소드를 보호하여 클라이언트 (문서 - Javadoc)에 노출되지 않도록합니다. 그러나 내부 클래스는 이들 클래스에 액세스 할 수 있어야합니다. Java 에서이 문제를 해결하는 일반적인 방법은 무엇입니까?

참고 : 현재 C ++ 표준에 정의 된 우정을 사용하고 있습니다.

감사

도움이 되었습니까?

해결책

일반적인 해결책은 패키지-프라이버시 (Java의 기본 보호 수준)를 메소드로 만드는 것입니다. 이렇게하면 동일한 패키지의 모든 코드는 외부 코드에 액세스 할 수 있지만 액세스 할 수 있습니다.

Java는 특정 외부 클래스와의 메소드를 임의적 인 공유를 허용하지 않습니다.

편집 : 보호 된 회원은 실제로입니다 더 적은 패키지-프라이버시보다 비공개. 보호 된 회원이있는 경우 패키지 외부의 파생 클래스와 패키지 내부의 모든 클래스에서 회원에 액세스 할 수 있습니다. 따라서 문제에 대한 해결책 일 수 있습니다. 내보내려고하는 패키지의 다른 클래스에서 수업을 도출하십시오.

일반적으로 Java는 패키지를 주요 캡슐화 모듈로 간주합니다. 공개/보호 된 인터페이스는 패키지 외부의 클래스를위한 것이며 기본 보호 수준은 패키지 내에서 액세스 할 수 있습니다.

다른 팁

마치 외관을 원하는 것처럼 보입니다.

구현과 관련된 다양한 다른 클래스 (다른 패키지에서도)에 공개적으로 액세스 해야하는 클래스가있는 것으로 보입니다. 그러나 고객이 액세스하는 것을 원하지 않습니다.

따라서 구현을 원하는만큼 복잡하게 만드십시오. 원하는 인터페이스 만있는 외관 수업이있어 구현에 위임하십시오.

이 링크는 Java에서 친구 액세스를 모방하는 방법을 제공합니다. http://macchiato.com/columns/durable7.html

링크에서 복사 된 코드 (사이트에 액세스 할 수없는 경우) :

public class A {
private int privateInt = 31415;

public class SomePrivateMethods {
    public int getSomethingPrivate() { return privateInt; }
    private SomePrivateMethods() {} // no public constructor
}
public void giveKeyTo(B other) {
    other.receiveKey(new SomePrivateMethods());
}
}

public class B {
private A.SomePrivateMethods key;

public void receiveKey(A.SomePrivateMethods key) {
    this.key = key;
}

public void usageExample() {
    A anA = new A();

    //int foo = anA.privateInt; // doesn't work, not accessible

    anA.giveKeyTo(this);
    int fii = key.getSomethingPrivate();
    System.out.println(fii);
}
}

내가 알아 차린 한 가지 ... 당신은 당신이 당신이 당신이 공개되도록 시리얼이즈를 구현하고 있기 때문에 당신이 무시 해야하는 방법을 원하지 않는 것처럼 들립니다. 그러나 직렬화 가능한 한 가지는 마커 인터페이스 (재정의 방법을 제공하지 않음)이며 readobject 및 writeObject 메소드는 비공개 여야합니다.

내가 뭔가를 놓치고 있습니까?

질문에는 모든 클래스를 동일한 패키지로 유지하지 않는 두 가지 솔루션이 있습니다.

첫 번째는 친구 액세서를 사용하는 것입니다.친구 패키지 (실제 API Design, Tulach 2008)에 설명 된 패턴.

두 번째는 Osgi를 사용하는 것입니다. 기사가 있습니다 여기 Osgi가 이것을 어떻게 달성하는지 설명합니다.

관련 질문 : 1, 2, 3, 그리고 4.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top