gpt4 book ai didi

java - Java 中只允许对对象实例进行单一引用的最佳方法

转载 作者:行者123 更新时间:2023-11-30 10:26:43 26 4
gpt4 key购买 nike

我想实现的是,假设我们有一个对象 jacket 并且我们知道在代码中一次只有一个人可以使用夹克:

Jacket jacket = createJacket();

bob.buy(jacket);
bob.useJacket(); // here bob has a reference to jacket

// now let's say bob is selling his jacket

bob.sellJacketTo(alice);

// now how to prevent bob from saving reference to
// jacket instance, because now it is alice jacket and
// only alice can use it

我现在的解决方案是创建一个“代理”来包裹一件“物理”夹克:

public class Jacket implements Outerwear {
private String color;
private int size;

Jacket(String color, int size) {
this.color = color;
this.size = size;
}

@Override
public void use() {
System.out.printf("%s jacket in size %d is warming you right now ;)", color, size);
}
// ...
}

public class JacketOwnership implements Outerwear {
private Jacket jacket;

private JacketOwnership(Jacket jacket) {
this.jacket = jacket;
}

public boolean isValid() {
return (jacket != null);
}

@Override
public void use() {
if (!isValid())
throw new IllegalStateException("You no longer own the jacket!");

jacket.use();
}

public JacketOwnership takePossession() {
Jacket tmp = this.jacket;
this.jacket = null;

return new JacketOwnership(tmp);
}

public static JacketOwnership createJacket(JacketFactory jacketFactory) {
Jacket jacket = jacketFactory.create();
return new JacketOwnership(jacket);
}
}

以上所有类都在同一个包中,但它们将从外部使用(换句话说,我们可以在这里像私有(private)一样处理包范围):

    JacketFactory factory = new JacketFactory(); // crate is package scoped
JacketOwnership jacket = JacketOwnership.createJacket(factory);

jacket.use();

JacketOwnership nowJacketIsMine = jacket.takePossession();
nowJacketIsMine.use();

我觉得这个解决方案有点复杂,有没有更简单/更好的方法?

附言。我不需要防弹解决方案 - 反射可能会破坏它,它只需要从 Java 语言的角度保存...

最佳答案

如何将所有这些解耦?

只需了解您的夹克类别,以及有关夹克本身的信息(颜色、尺码等)。没有执行业务逻辑的方法。

然后是你的人类,包含有关人本身的信息(姓名、年龄等)。没有执行业务逻辑的方法。

然后是您的 jacketowner 实体,您可以根据自己的喜好对其进行建模。然后你可以只拥有夹克所有者的 repo (库存)并根据需要进行限制(例如不允许同一件夹克出现两次)。在最简单的形式中,jacketowners 的 repo 可以包含在一个

HashMap<Jacket, Person>

由于您解耦了 jacket-person 并删除了实体内部的业务,您可以轻松地拥有所有“链接”的 repo ,并将它们作为一个整体作为服务的一部分添加约束(您有您的业务逻辑) .

关于java - Java 中只允许对对象实例进行单一引用的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45577053/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com