对象可以成为朋友吗?

正如前面所讨论的 ,适当的封装导致完全不存在“裸数据”。 但是,问题仍然存在:如果对象无法交换数据,该如何交互? 最终,我们必须公开一些数据以便其他对象使用它,对吗? 是的,这是真的。 但是,我想我有一个解决方案,可以在允许对象交互的同时保持封装不变。

愤怒的公牛(1980),马丁·斯科塞斯(Martin Scorsese)

说这是我们的目标:

class Temperature {
  private int t;
  public String toString() {
    return String.format("%d C", this.t);
  }
}

它代表温度。 它显示的唯一行为是打印摄氏温度。 我们不想公开t ,因为这将导致“裸数据”问题。 我们要保持t秘密,这是一个美好的愿望。

现在,我们希望能够以华氏度打印温度。 最明显的方法是引入另一个方法toFahrenheitString()或向对象添加一个布尔标志,这将更改toString()方法的行为,对吗? 这些解决方案中的任何一个都比添加方法getT()更好,但是没有一个是完美的。

如果我们创建此装饰器怎么办:

class TempFahrenheit implements Temperature {
  private TempCelsius origin;
  public String toString() {
    return String.format(
      "%d F", this.origin.t * 1.8 + 32
    );
  }
}

它应该工作得很好:

Temperature t = new TempFahrenheit(
  new TempCelsius(35)
);

唯一的问题是它将无法在Java中编译,因为不允许类TempFahrenheit访问TempCelsius类中的private t 。 如果我们做t市民,大家将能够直接读取它,我们会有一个“裸数据”的问题,严重违反了封装。

但是,如果我们允许访问一个班级,那么一切都会很好。 诸如此类(在Java中不起作用;这只是一个概念):

class TempCelsius {
  trust TempFahrenheit; // here!
  private int t;
  public String toString() {
    return String.format("%d C", this.t);
  }
}

由于此trust关键字已放置在允许访问的类中,因此我们不会遇到“裸数据”问题-我们将始终确切地知道哪些对象具有有关t知识。 当我们更改有关t ,我们确切地知道在哪里更新代码。

你怎么看?

您可能还会发现这些有趣的相关文章: 封装掩盖了裸数据您的对象封装了多少? ; 对象行为不可配置 ; 不可变对象如何具有状态和行为? ; 不变性的梯度 ;

您的浏览器禁用了JavaScript,这就是为什么您不能在此帖子下看到评论。

翻译自: https://www.javacodegeeks.com/2016/12/can-objects-friends.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值