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

如何控制Java类中字段的可见性?,java,oop,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' } 一种方法是使用面向方面的编程。您可以检查以查看正在访问的包或类,并禁止访问 AspectJ可用于强制执行持久层中的类不会在web层中访问,而只能从服务层访问。下面是一个例子: 接口时间: interface IHa

如何对任何类的成员进行差异控制访问?假设我有三门课:-

Class A
{
int a;
int b;
}

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

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

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

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

接口时间:

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);
}

这是一个非常粗糙的想法

  • A有一个函数,用于获取从B派生的观察者,另一个函数用于获取从A派生的观察者

    class A
    {
        int a;
        int b;
        void getAObserver(B bInstance);
        void getBObserver(C cInstance);
    }
    
  • 然后,可以在实例上调用诸如aWasUpdated或bWasUpdated之类的函数,使成员A和b对特定类进行某种psuedo公开


  • 实现这一点的一种非常粗糙的方法是

    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){
        } 
    }
    }
    

    你从未听说过:受保护、私有和公共?@BookOfZeus:他将如何使用访问说明符实现差异访问?我相信在任何好的设计中都不需要这样的层次结构,但由于您的回答,我很想知道您如何使用访问说明符来实现这一点。我误解了这个问题,您是对的,我想同时在C#和Java中实现这一点。@Gurpret:为什么您同时用C#和Java编写?你也没有回答我的第一个问题:为什么?在这个设计中,如果B类也有“IHaveB”\u IHaveB”,那么B类可以同时访问“a”和“B”。它不能被很强的控制吗?@gurpreetsigh也许你应该解释一下,如果B类需要IHaveB,那么你为什么不想让它访问B?!!!听起来很奇怪!对于C#,PostSharp有类似的方面可以控制可见性,请参阅以获取组件内部、内部实现和内部的示例。如果这些不适合你的需要,你可以写一个适合你的。