如何控制Java类中字段的可见性?

时间:2012-02-05 17:01:25

标签: java oop

如何区分控制对任何班级成员的访问?假设我有三个班级: -

Class A
{
int a;
int b;
}

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

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

4 个答案:

答案 0 :(得分:1)

一种方法是使用面向方面的编程。您可以查看访问包或类,并禁止访问。

AspectJ可用于强制执行持久层中的类不在Web层中访问,只能从服务层访问。这是一个例子:

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

答案 1 :(得分: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);
}

答案 2 :(得分:0)

这是一个非常粗略的想法。

  1. A有一个函数来从B派生一个观察者,另一个函数带一个派生自A的观察者。

    class A
    {
        int a;
        int b;
        void getAObserver(B bInstance);
        void getBObserver(C cInstance);
    }
    
  2. 然后让A可以在实例上调用aWasUpdated或bWasUpdated等函数,使成员a和b类型的psuedo公开到特定的类。

答案 3 :(得分: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){
    } 
}
}