Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:字符串类型返回必须转换为三种不同类型中的一种。如何避免开关/外壳?_Java - Fatal编程技术网

Java:字符串类型返回必须转换为三种不同类型中的一种。如何避免开关/外壳?

Java:字符串类型返回必须转换为三种不同类型中的一种。如何避免开关/外壳?,java,Java,我四处寻找一些答案,但运气不好。事实上,解释我想用词做什么有点复杂,所以让我们来看一些小飞贼: 我有4个属性: private int pageCount; //type 1 private int[] monoColorCount; //type 2 private float cost; //type 3 private int type; 但在任何时候,一个对象只对其中一个对象有价值。它们由一个返回字符串(从XML解析)的方法提供,根据类型,我将知道哪个字符串有值。我的第一次尝试是交换

我四处寻找一些答案,但运气不好。事实上,解释我想用词做什么有点复杂,所以让我们来看一些小飞贼:

我有4个属性:

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好吧,过了一段时间,现在我认为只要不需要改变现有对象的状态(它只能在一种状态下——给定代码中的var
int-type
不能改变)
策略
就是最佳选择:)
class CostQuota extends Quota {
}

class PageCountQuota extends Quota {
}

class ColorPageCountQuota extends Quota {
}