【问题标题】:Java,cloning classes with access restrictionsJava,克隆具有访问限制的类
【发布时间】:2014-12-17 20:41:08
【问题描述】:

我有:

  • 类 Personne 实现 Cloneable...

personne 类在其字段中使用 Adress 类。

  • 私人地址=ADRESSE_UNKNOWN;

所以我想要的是有一个选项:

  • 修改克隆的Person地址

    这是我的克隆方法:

    Object o = null;
    try {
    o = super.clone();
    } catch(CloneNotSupportedException cnse) {
      cnse.printStackTrace(System.err);
        }
        return o;
    } 
    
  • 但是原始的 Person 类将无法访问 克隆人类地址字段。

请给我一个提示。

【问题讨论】:

  • 也许克隆人在道德上是错误的?
  • 我的建议是avoid using Cloneable
  • 假设我们在获得授权的英格兰进行克隆
  • 为什么不重写 clone() 方法,只在调用 clone() 时修改地址...
  • 我会将它添加到主题中,因为它在同一行中放置所有内容

标签: java clone encapsulation


【解决方案1】:

试试这个:

public Personne clone()
{
    Personne o;
    try {
       o = (Personne)super.clone();
       o.adresse = null;//or just change it however you want here.
       return o;
    } catch(CloneNotSupportedException cnse) {
      cnse.printStackTrace(System.err);
      throw new RuntimeException();
    }
}

确保 Personne 的属性是不可变的,如果不是,您应该在主 clone() 方法中为每个不可变的属性单独调用 clone() 方法。

【讨论】:

  • 好的,看起来不错。但请告诉我:你如何更改 Adress 的访问权限?
  • @Vladimir 我没有更改地址的访问权限,它仍然是私有的,但由于 clone() 方法也在 Personne 类中,它可以访问私有属性 adresse
  • 是的!那是我的问题。但是查看您的代码,我说您正在访问该人的地址字段并覆盖它。但是由于它被修改了,它仍然可以被原始的 Person 类访问吗?,如果你明白我的意思。
  • 你认为如果我这样做可能是一个解决方案?
  • 附在主题中
【解决方案2】:

好的,伙计们,在我的帮助下,我明白了。 覆盖 clone() 方法的可能性是提供修改克隆类字段的机会。作为建议的解决方案,将类的地址字段重置为 NULL。 然后我创建了一个设置器,它提供了修改克隆地址字段的选项。

    @Override
    public Personne clone()
{
    Personne o;
    try {
       o = (Personne)super.clone();
       o.adresse = null;
       return o;
    } catch(CloneNotSupportedException cnse) {
      cnse.printStackTrace(System.err);
      throw new RuntimeException();
    }
}
 // setter pour l adresse du Clone :
    public void setAdresseClone(Adresse a){
    this.clone().adresse = a;
    }

【讨论】:

    猜你喜欢
    • 2010-12-04
    • 2013-01-01
    • 1970-01-01
    • 2018-11-12
    • 2017-10-08
    • 2011-09-08
    • 2011-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多