首页 / JAVA / java-从字符串初始化子类对象
java-从字符串初始化子类对象
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java-从字符串初始化子类对象,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2176字,纯文字阅读大概需要4分钟。
内容图文
考虑一个多人格斗游戏,客户端通过向服务器发送一个包含刚选择的战斗机名称的字符串来选择战斗机.
考虑服务器中的“战士”类结构:
Fighter
Foo extends Fighter
Bar extends Fighter
Qux extends Fighter
例如,客户端发送了此“ Bar”字符串,如何根据该字符串初始化子类?
我这样做的方式是这样的枚举:
public enum Champion {
Foo {
@Override
public Fighter getNew() {
return new Foo();
}
},
Bar {
@Override
public Fighter getNew() {
return new Bar();
}
},
Qux {
@Override
public Fighter getNew() {
return new Qux();
}
};
public abstract Fighter getNew();
public static boolean contains(String fighter) {
for (Champion c : Champion.values()) {
if (c.name().equals(fighter)) {
return true;
}
}
return false;
}
}
然后我得到一个像这样的对象:
public Fighter getFighter(String fighterName) {
if(Champion.contains(fighterName)) {
return Champion.valueOf(fighterName).getNew();
} else {
return null;
} // For example sake only :)
}
这是处理这种遭遇的正确方法吗?有没有更好的办法?我记得有一种已知的方式可以处理此类遭遇,但无法确切记住哪种方式.
如果您有想法,请告诉我!
解决方法:
使用工厂,解决方案如下所示:
interface FighterFactory {
Fighter create();
}
保留Map< String,FighterFactory>外观中的变量.每种战斗机类型都必须在此地图中与其工厂一起注册.
private Map<String, FighterFactory> fighters;
public void register(String name, FighterFactory factory) {
fighters.put(name, factory);
}
在每种Fighter类型中都嵌入一个内部类Factory例如
class Foo extends Fighter {
//code for Foo
public static class Factory implements FighterFactory {
public Foo create() {
return new Foo();
}
}
}
// and in your Facade
register("Foo", new Foo.Factory());
要实例化新的Fighter,请进入Fighter-Map并对其结果执行create.
FighterFactory factory = fighters.get(nameFromClient);
// null handling, if nameFromClient is not a Fighter type;
return factory.create();
与反射相比,此设计具有一些优点:
>它是安全的
> create方法可以做的不仅仅是构造函数
以及单一工厂方法(一种方法可处理所有Fighter类型):
>如果create方法变得比您对代码所做的更改更复杂(例如,创建实例需要更多的参数),则位于Fighter类而非工厂方法处.
和枚举方法:
>使用的Enum的唯一功能是遍历其值.保留值映射将用映射查找替换迭代
>如何构造战斗机的信息位于战斗机附近,而不是冠军枚举
>您甚至可以确定FighterFactories是顶级类,而枚举内部类Factories则无法实现.
内容总结
以上是互联网集市为您收集整理的java-从字符串初始化子类对象全部内容,希望文章能够帮你解决java-从字符串初始化子类对象所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。