为了账号安全,请及时绑定邮箱和手机立即绑定

在 Java 中将对象从一个位置移动到另一个位置

在 Java 中将对象从一个位置移动到另一个位置

largeQ 2021-05-31 10:41:51
这是我发现很难研究的东西,因为它需要一些解释。我基本上想了解在其他物体周围移动物体的最佳方式并跟踪所有物体的位置。请允许我解释..让我们假设我们正在创建一个 Person 类和一个 Park 类。park 类有一堆玩具和游乐设施供人玩。这些可能是 Slide 类、SeeSaw 类等。但是假设我们的程序需要始终跟踪 Person 对象的位置。如果他们在幻灯片上,我们将要询问班级他们的位置。例如...//location could be set in the person whenever we move them..person.setLocation(slide);//now getLocation could return the object they are on (slide, seesaw, ect)person.getLocation(); 但是现在假设我想弄清楚在任何给定时间谁在公园中的 Slide 对象上。它会是这样的......slide.getOccupants(); // could return the objects that are on the slide (Persons)但是现在这意味着当人在公园中从一个对象移动到另一个对象时。我不得不说类似...person.setLocation(seeSaw);slide.removeOccupant(person);seeSaw.addOccupant(person);//this would get annoying and scary to do everytime a person moves...那么创建一种方法来处理所有这些变化是要走的路吗?例如,每次一个人移动时,它都可以调用此代码......//person being who you're moving and the ride being where you're moving them to..public void move(Person person, Ride ride){    person.getLocation().removeOccupant(person);    person.setLocation(ride);    person.getLocation().addOccupant(person);}我不禁觉得有一种更好的方法可以做到这一点,因为它感觉在更大范围内变得混乱。也许我想得太多了,但我很想知道这方面的任何最佳实践或设计。
查看完整描述

3 回答

?
梵蒂冈之花

TA贡献1900条经验 获得超5个赞

根据函数式编程人员的说法,您遇到了真正的面向对象问题。作为一个纯粹的OO驱动的世界也不会允许你代表一致的方法解决此问题。不管你怎么做,你最终都会得到以下三种可能性之一:

  • 人 X 无处可去

  • 人 X 在两个位置

  • 你不知道X在哪里

所以这里真正的问题是你有多个对象,移动位置会改变整个系统状态。没有线程一切正常,但是一旦您有多个线程启动,不同的线程可能会看到不一致的状态。

因此,FP 人员告诉您,您首先需要通过具有将系统从一个有效状态“移动”到另一个有效状态的功能来解决这个概念性问题。非常像您的move()代码,但在使用该方法时不会不一致地更新“对象状态”。

好的,但这可能不是您要的。您的问题的一个答案是:人员搬迁视为一项服务。您有实体(人员、位置),该服务负责“移动”事物。

你猜怎么着:那么你的第一个实现是一个好的开始。所以,实际上,对于一个“教育”项目,你做得很好。可能你应该考虑使用合适的接口(抽象被移动的“事物”的细节,或者它们从/到的地方)。把它放到一个特定的服务类中,然后从那里开始工作。


查看完整回答
反对 回复 2021-06-02
?
翻阅古今

TA贡献1780条经验 获得超5个赞

要维护关于谁和曾经在 a 的历史和当前信息Location,您没有成千上万的选择:您必须将它们保存在某个地方。

您的示例代码显示了一种方法。

另一种方法是通过应用 Aspect 来使用 AOP,该 Aspect 会在每次有人移动到某个地方时更新状态。

但是,如果您这样做是为了节省 3 或 4 次调用,则似乎有点过分。


关于实际代码,您可以使用接受任何Location更通用的方法来分解此处理,例如:


public void move(Person person, Location newLocation){  

    person.getLocation().removeOccupant(person);

    person.setLocation(newLocation);

    person.getLocation().addOccupant(person);

}

这样,对于客户端代码来说就更直接了。


附带说明一下,一个Location实例可能不应该负责为自己设置 any 的集合Location。它给了它太多的责任。

您可以通过将处理委托给Locations负责状态更改的类来分离关注点。


查看完整回答
反对 回复 2021-06-02
?
繁华开满天机

TA贡献1816条经验 获得超4个赞

一种可能的解决方案是,与其构建一个全新的 move 方法,这会造成代码过多的感觉,而是允许该人的 setLocation 方法基本上使用与您构建的 move 方法相同的代码(从当前的公园玩具中删除该人)并将它们移动到另一个)。这将允许更清晰的代码,并应保持所有功能相同。


查看完整回答
反对 回复 2021-06-02
  • 3 回答
  • 0 关注
  • 256 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信