Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 访问私有父属性的最佳实践?_Java_Oop - Fatal编程技术网

Java 访问私有父属性的最佳实践?

Java 访问私有父属性的最佳实践?,java,oop,Java,Oop,假设您有两个类,父类和继承自父类的子类Parent有一个属性a,该属性设置为private,子类有一个doSomething()方法,该方法需要访问a如下: public class Parent { private Attriute a; public Parent(Attribute a) { this.a = a; } } public class Child extends Parent { public Child(Attribute a) { sup

假设您有两个类,
父类和继承自
父类的
子类
Parent
有一个属性
a
,该属性设置为private,子类有一个
doSomething()
方法,该方法需要访问
a
如下:

public class Parent {
  private Attriute a;
  public Parent(Attribute a) {
    this.a = a;
  }
}

public class Child extends Parent {
  public Child(Attribute a) {
    super(a);
  }
  public void doSomething() {
    // Need to access to a here
  }
}
我的问题是:有没有从
孩子
访问
a
的最佳方法?我对如何继续下去没有什么想法:

  • Parent
    中的
    protected
    处设置
    a
    的可见性,但是
    a
    在包中的任何位置都可以访问和修改
  • a
    Parent
    中创建一个受保护的getter,但它也可以在包的任何地方访问
  • 子类
    中创建一个新的私有
    属性
    字段,并将
    a
    保存到构造函数中。这样,“新a”属性只能从
    Child
    访问,并且它与
    Parent
    属性是同一个对象,但在这两个类中它也会“复制”
    a
但是我不知道哪一个是最好的,也许这些都不是,所以帮帮我

也许就是你想要的

创建返回private属性的受保护方法,以及一个限制,以便只有子类才能获取该属性

public class Parent {
    private Attribute a;
    public Parent(Attribute a) {
        this.a = a;
    }
    protected Attribute getA() throws IllegalAccessException, ClassNotFoundException {
        if(!getClass().isAssignableFrom(
        Class.forName(new Throwable().getStackTrace()[1].getClassName()))) {
            throw new IllegalAccessException(
                "This method can be accessed by subclass only");
        }
        return a;
    }
}

public class Child extends Parent {
    public Child(Attribute a) {
        super(a);
    }
    public void doSomething() throws IllegalAccessException, ClassNotFoundException {
        Attribute a = getA();
    }
}

在Java中,如果不对同一个包中的所有类授予成员访问子类的权限,就无法授予成员访问子类的权限

只需为字段添加一个getter方法,并将其设置为受保护的。这提供了比您希望的更多的访问权限,但通常是可以接受的


如果封装非常关键,您可以将类移动到其包中,并防止以这种方式允许访问非子类。

使用getter和setter。您可以将逻辑放入getter/setter以限制其accessibility@Michael要是那是真的就好了——但事实并非如此。在Java中,
protected
提供对包和子类的访问。@davmac显示了我使用实现继承的频率…:)或者把敏感类转移到他们自己的包里。我真的没有得到否决票。我的答案怎么了?