2012-02-05 2 views
0

클래스의 멤버에 대한 액세스를 차별적으로 제어하려면 어떻게해야합니까? 저는 세 가지 클래스가 있다고 가정 해 봅시다 :Java 클래스의 필드에 대한 가시성을 어떻게 제어합니까?

Class A 
{ 
int a; 
int b; 
} 

Class B 
{ 
Access to only 'a' and not 'b' 
} 

Class C 
{ 
Access to only 'b' and not 'a' 
} 
+5

1) 당사 2) 어떤 언어로 것입니까? –

+0

당신은 결코 들어 본 적이 없습니다. –

+1

@BookOfZeus : * 액세스 지정자 *를 사용하여 차동 * 액세스를 어떻게 달성합니까? 나는 좋은 디자인에 그런 계층 구조가 필요 없다고 생각하지만 당신의 응답 이후로 나는 액세스 지정자를 사용하여 이것을 어떻게 달성 할 수 있을지 궁금하다. –

답변

1

한 가지 방법은 aspect 지향 프로그래밍을 사용하는 것입니다. 액세스중인 패키지 또는 클래스를 확인하고 액세스를 금지 할 수 있습니다.

AspectJ를 사용하면 웹 계층에서 지속성 계층의 클래스에 액세스하지 않고 서비스 계층에서만 액세스 할 수 있습니다.

http://blog.jayway.com/2010/03/28/architectural-enforcement-with-aid-of-aspectj/

+0

C#의 경우 PostSharp는 가시성을 제어 할 수있는 비슷한면을 가지고 있습니다. ComponentInternal, InternalImplements 및 Internal의 예는 http://www.sharpcrafters.com/blog/post/Architectural-Validation.aspx를 참조하십시오. 그것들이 당신의 필요에 맞지 않는다면, 아마 당신이 쓸 수있는 것입니다. –

1

인터페이스 시간 :

이 같은
interface IHaveA { int a {get;set;} } 
interface IHaveB { int b {get;set;} } 

Class A : IHaveA, IHaveB 
{ 
    public int a {get;set;} 
    public int b {get; set;} 
} 

Class B 
{ 
    IHaveA _iHaveA; 

    C(IHaveA iHaveA) 
    { 
    _iHaveA = iHaveA; 
    } 
} 

Class C 
{ 
    IHaveB _iHaveB; 

    C(IHaveB iHaveB) 
    { 
    _iHaveB = iHaveB; 
    } 
} 

그런까지 새로운 B와 C : 여기

static Main() 
{ 
    A a = new A(); 
    B b = new B(a); 
    C c = new C(a); 
} 
+0

이 디자인에서 클래스 B에도 'IHaveB _iHaveB'가 있으면 클래스 B는 'a'와 'b'에 모두 액세스 할 수 있습니다. 그것이 강하게 통제 될 수 있다고? –

+0

@GurpreetSingh 어쩌면 클래스 B가 IHaveB를 필요로한다면 그것을 달성하려고하는 이유를 설명해야 할 것입니다. 그렇다면 왜 B에 액세스하려고하지 않으시겠습니까? 나에게 이상한 소리! –

0

정말 원유 생각이 여기에 예입니다.

  1. 가지고는

    class A 
    { 
        int a; 
        int b; 
        void getAObserver(B bInstance); 
        void getBObserver(C cInstance); 
    } 
    
  2. 이 다음은 aWasUpdated 또는 bWasUpdated 같은 함수를 호출 할 수있는 A. 유래 관찰자를 취할 B 유래의 옵저버를 수행하는 기능과 다른 기능을 가질 경우에 따라 구성원을 특정 클래스에 공개 된 psuedo 유형으로 만듭니다. 이 구현

0

정말 원유 방법은

Class A { 
private int a ; 
private int b ; 

public int getA(Object obj) throws userDefinedIllegalAccessException { 
    //check if obj isInstance of B 
    // If yes return a 
    // else throw userDefinedIllegalAccessException 
} 
public int getB(Object obj) throws userDefinedIllegalAccessException { 
    //check if obj isInstance of c 
    // If yes return b 
    // else throw userDefinedIllegalAccessException 
} 

} 

class B { 

public void checkAccessValue() { 
    try{ 
     A objA = new A() ; 
     System.out.println(objA.getA(this) ; 
     System.out.println(objA.getB(this) ; 
    } 
    catch(userDefinedIllegalAccessException udException){ 
    } 
} 
} 

class C { 

public void checkAccessValue() { 
    try{ 
     A objA = new A() ; 
     System.out.println(objA.getA(this) ; 
     System.out.println(objA.getB(this) ; 
    } 
    catch(userDefinedIllegalAccessException udException){ 
    } 
} 
} 
관련 문제