Java 泛型类的动态验证有哪些方法?
因此,基本上,这个标题听起来比实际的问题更有趣 我正在写一个申请,我想在其中实现一个成就系统。如果我的所有成就都是作为泛型类的实例创建的,那么我如何编写一个方法来验证这些成就(即,确定用户是否达到或超过了目标),当完成的专长类型可能不同,需要满足的条件数量可能不同,验证类型可能不同时 例如: 成绩-10000分Java 泛型类的动态验证有哪些方法?,java,android,eclipse,algorithm,achievements,Java,Android,Eclipse,Algorithm,Achievements,因此,基本上,这个标题听起来比实际的问题更有趣 我正在写一个申请,我想在其中实现一个成就系统。如果我的所有成就都是作为泛型类的实例创建的,那么我如何编写一个方法来验证这些成就(即,确定用户是否达到或超过了目标),当完成的专长类型可能不同,需要满足的条件数量可能不同,验证类型可能不同时 例如: 成绩-10000分 类型-总分 值(X)-10000 条件-1 验证-大于X vs 成就-超碎片 类型-杀死 值(X)-10 类型-时间 值(Y)-10秒 条件-2 验证-至少X小于Y 我试图避免为每项成就
类型-总分
值(X)-10000
条件-1
验证-大于X vs 成就-超碎片
类型-杀死
值(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
}
}
编辑防止继承(和使用合成)的另一个选项是使用类似于
当与匿名内部类一起使用时,它几乎使用函数指针
registerAchievement(new Achievement("Zombie Killer", new AchievementValidator() {
public boolean isSatisfied(Data data) { return data.getZombieKills() >= 50; }
});
Java中的函数指针(通常在任何面向对象语言中)通常被多态对象所取代
关于不硬编码验证,我认为不值得为此编写一个规则引擎,这样做的工作量会大得多。你可以做的是将同一类型的成果与同一类的对象统一到一个具有不同阈值的字段中。java中没有函数指针。@Shengyuan Lu我想他/她知道这一点t java中没有函数指针。@Flyingstrudel我的建议是等待java 7闭包。是的,这是我能想到的唯一解决方案,但我试图找到一种不需要抽象基类的方法:(如果所有其他方法都失败了,我会回到这个问题上来。编辑错误不是抽象而是是的。@flyingstrudel:你为什么要避免这个问题?这么做是为了好玩,因为我是编程技术的一个练习。我想看看是否有一种方法可以实现相同的功能,而不必重复我不想限制I的类型nput。所以,如果我想添加一个全新的、以前从未想过的成就类型,我可以不必添加新的成就类型。@Flyingstrudel:那么你可能需要一些基本的语言/口译员。
registerAchievement(new Achievement("Zombie Killer", new AchievementValidator() {
public boolean isSatisfied(Data data) { return data.getZombieKills() >= 50; }
});