Java:字符串类型返回必须转换为三种不同类型中的一种。如何避免开关/外壳?
我四处寻找一些答案,但运气不好。事实上,解释我想用词做什么有点复杂,所以让我们来看一些小飞贼: 我有4个属性:Java:字符串类型返回必须转换为三种不同类型中的一种。如何避免开关/外壳?,java,Java,我四处寻找一些答案,但运气不好。事实上,解释我想用词做什么有点复杂,所以让我们来看一些小飞贼: 我有4个属性: private int pageCount; //type 1 private int[] monoColorCount; //type 2 private float cost; //type 3 private int type; 但在任何时候,一个对象只对其中一个对象有价值。它们由一个返回字符串(从XML解析)的方法提供,根据类型,我将知道哪个字符串有值。我的第一次尝试是交换
private int pageCount; //type 1
private int[] monoColorCount; //type 2
private float cost; //type 3
private int type;
但在任何时候,一个对象只对其中一个对象有价值。它们由一个返回字符串(从XML解析)的方法提供,根据类型,我将知道哪个字符串有值。我的第一次尝试是交换机/机箱,这是一个有效但效率很低的解决方案:
switch(type){
case 1: pageCount = Integer.parseInt(QuotasBalance.getUserQuota(user, domain)); break;
case 2: StringTokenizer st = new StringTokenizer(QuotasBalance.getUserQuota(user, domain), "|");
monoColorCount = new int[]{Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken())}; break;
case 3: cost = Float.parseFloat(QuotasBalance.getUserQuota(user, domain));
}
也许我应该在前面提到:我对Java1.4非常感兴趣,因此使用了StringTokenizer。在这种情况下,每次需要外部类的值时,我都必须使用switch/case-on类型:
switch(myQuotaInstance.getType){
case 1: /*Do something with pageCount*/
case 2: /*Do something with monoColorCount*/
case 3: /*Do something with cost*/
}
不用说,那太荒谬了。我也尝试过多态性和反射,但由于我还没有完全掌握反射的概念,这是另一条死胡同。我尝试创建一个不同的类来封装这三个属性,这三个属性只负责委派不可避免的任务。嗯,我想我已经说清楚了。现在我愿意接受关于如何解决这个问题的建议。你可以抓住战略模式。首先要有一个接口
public interface Strategy {
void execute(QuotaInstance instance);
}
然后进行映射
private Map strategies = new HashMap();
{
strategies.put(Integer.valueOf(1), new PageCountStrategy());
// ...
}
然后按如下方式执行它
((Strategy) strategies.get(Integer.valueOf(type))).execute(myQuotaInstance);
在
execute()?我建议使用state,因为这在我看来是很自然的,但我记得你关于patters的“臭名昭著的帖子”,所以我想你是对的;) 配额对象在其生存期内是否会更改其类型
如果没有,最好创建三个不同的类(可以有一个公共接口或基类)
它们中的每一个都可以有一个字符串构造函数来进行解析,因此在创建对象时只需要一个类型开关。(但您也可以将它们序列化为不同的XML元素,因此根本不需要int类型。)。。。我研究了战略和国家模式,它们完全是过火了。事实上,我用一种非常简单(甚至有点n00bish)的方式解决了这个问题:我在我的应用程序第三层中将返回值从字符串转换为它的正确类型。当我意识到这个值类型在到达第一层(UI)之前并不重要时,我决定以字符串的形式传递它,在第一层中,我会切换它(就像我在第三层中所做的那样),在转换过程中,我会调用另一种方法来构建UI本身,因为它依赖于要构建的值类型,但不依赖于值本身。是的,不是“优雅”或任何东西,但在这个领域,我认为它很适合(总的来说,配额类实际上可以是静态的)
但是感谢您的评论,我已经研究了状态和策略模式,并最终学习了(实际上是“重新学习”)一些在任何地方都非常有用的模式,比如方法模板和工厂
方法模板是如此明显,却如此被忽视^^ 被困在Java1.4中?你知道Java5是八年前推出的吧?我就知道一些聪明的家伙会这么说,我应该做好更好的准备。我目前正在开发一个多功能打印机的嵌入式应用程序,它们的VM只是Java1.4的一个子集,有一些自定义的用户界面类。好了,我不明白你的QuotaBalance
。它是否返回3个不同的字符串,并使用相同的参数调用3次?你能把整个方法的代码发布到你试图解析这些字段的地方吗?@glowcoder,。。。你知道Java 5.0差不多在1.5年前就已经下线了。@glowcoder:有些人必须支持COBOL应用,信不信由你。请注意,我最初发布这个答案时考虑的是Java 1.5(泛型,自动装箱),对不起,我已经编辑过了:)好了,我知道这一定有一个设计模式!让我试试看!即使在1.4中,我也认为存在Integer.valueOf(int)
注意,您可能需要传递一些包含感兴趣的变量的上下文,而不是QuotaInstance
,这取决于需要完成的工作@伊斋:那的确是个更好的选择。你可能是对的。这个问题的大背景还不够清楚,无法给出一个明确的答案(这也是我以“你可以”开头的原因)@Balusc好吧,过了一段时间,现在我认为只要不需要改变现有对象的状态(它只能在一种状态下——给定代码中的varint-type
不能改变)策略
就是最佳选择:)
class CostQuota extends Quota {
}
class PageCountQuota extends Quota {
}
class ColorPageCountQuota extends Quota {
}