java - 如何放置不适合任何类的方法
问题描述
我正在编写一个程序来实现纸牌游戏,但我无法弄清楚其中一种方法的放置位置:特别是检查一张牌是否大于另一张牌的方法,
public boolean rankGreater(Card card1, Card card2) {
return card1.getRankId() < card2.getRankId();
}
我遇到麻烦的原因是因为我计划在策略模式的一个实现中使用这种方法来处理计算机控制的对手的行为,以及在我的Round类中跟踪每轮的最终获胜者;并且将 Round 一直传递到这个特定的策略中是没有意义的。我应该在哪里以确保高凝聚力的方式定义此方法?
我已经包含了我的班级关系的超级粗略图表:
编辑:卡是外部库的一部分
解决方案
如果你定义Card
了自己
在类中实现方法Card
:
public class Card {
...
public boolean rankGreater(Card card2) {
return this.getRankId() < card2.getRankId();
}
...
}
rankGreater(card1, card2)
然后你会写而不是写card1.rankGreater(card2)
。
在java中,这样的事情通常使用接口来实现Comparable
。这样,您可以使用预定义的方法,例如Collections.sort(...)
和Arrays.sort(...)
。
这里我rankGreater
再次实现了一个例子来说明如何使用compareTo
.
public class Card implements Comparable<Card> {
@Override
public int compareTo(Card other) {
return Integer.compare(this.getRankId(), other.getRankId());
}
...
public boolean rankGreater(Card card2) {
return this.compareTo(card2) < 0;
}
...
}
如果你不能改变定义Card
当Card
在库中定义时,您不能简单地更改其定义。好吧,理论上你可以(只添加方法不会破坏事情),但我不推荐它,因为你每次更新或安装(例如在构建过程中自动mvn
)库时都必须应用手动更改。
在这种情况下,请创建该方法public static
并将其放入实用程序类中。如果你只需要在另一个类中,你也可以把它放在那里并制作它private static
。
推荐阅读
- python - Python matplotlib:从matplotlib的工具栏中删除“配置子图”工具会导致错误
- windows - 检索 Windows 10 电源模式滑块的状态
- python - 在列表中查找字符串的列表理解?
- android - 有什么问题,我从 Firebase 得到 0 作为值吗?
- spring-boot - 无法覆盖詹金斯中的服务器端口
- r - 用正态分布覆盖直方图
- azure - 我可以对 Azure 应用服务进行实时威胁防护吗
- c# - 使用 EF Core 进行 CQRS/ES 投影重播
- jenkins - 重启后的 Jenkins 错误:java.lang.IllegalStateException:预期 1 个 hudson.model.User$AllUsers 实例但得到 0
- javascript - 动态获取keycloak.json?