gpt4 book ai didi

java - 泛型类的动态验证有哪些方法?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:36:29 26 4
gpt4 key购买 nike

所以基本上这个标题听起来比实际问题更花哨。

我正在编写一个应用程序,我想在其中实现一个成就系统。如果我将所有成就创建为通用类的实例,当完成的壮举类型、条件数量可能不同时,我该如何编写方法来验证这些成就(即确定用户是否达到或超过目标)要满足的条件可能会有所不同并且验证类型可能会有所不同?

例如:

成就 - 10,000 点!
类型 - 总分
值(value) (X) - 10,000
条件 - 1
验证 - 大于 X

对比

成就 - super fragment
类型 - kills
值 (X) - 10
类型 - 时间
值 (Y) - 10 秒
条件 - 2
验证——至少 X 小于 Y

我试图避免为每个成就硬编码验证函数,因为它们主要是通用的,唯一的区别是它们的验证方式。

就像成就类看起来像

public class Achievement 
{
boolean locked;
String name;
String desc;

public Achievement(string n, string d)
{
//ctor code
}
}

我正在尝试想出一种无需函数指针的方法,但我失败得很惨。另外,你甚至可以在 java 中使用函数指针吗?我是这门语言的新手 :(

最佳答案

我认为正确的做法是为每个成就设置一个验证方法:

public abstract class Achievement {
//...name, etc
public boolean isSatisfied(Data byPlayerData);
}

但这并不能阻止您提供一些具体的实现并使用参数配置它们。

public class ZombieKillingAchievement extends Achievement {
private final int numKills;
public ZombieKillingAchievement(String name, int numKills) {
this.numKills = numKills;
}
public boolean isSatisfied(Data userData) {
return userData.getZombieKills() >= numKills;
}
}

//...
registerAchievement(new ZombieKillingAchievement("Zombie Master", 100));
registerAchievement(new ZombieKillingAchievement("Zombie Tamer", 50));

//... on user data change
for ( Achievement a : registeredAchievements ) {
if ( a.isSatisfied() ) {
//show congratulatory message
}
}

编辑 另一个防止继承(和使用组合)的选项是使用类似于 strategy pattern 的东西.

public class Achievement {
//...name, etc
private final AchievementValidator validator;
}

public interface AchievementValidator {
public boolean isSatisfied(Data userData);
}

当与匿名内部类一起使用时,它几乎是在使用函数指针

registerAchievement(new Achievement("Zombie Killer", new AchievementValidator() {
public boolean isSatisfied(Data data) { return data.getZombieKills() >= 50; }
});

关于java - 泛型类的动态验证有哪些方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3558635/

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