【问题标题】:effective and pretty string conditions in JavaJava中有效且漂亮的字符串条件
【发布时间】:2012-04-04 17:48:47
【问题描述】:

我有一个关于代码风格的问题:

假设我有一个包含一些信息的字符串(如“Information1”或“Information2”)。基于此,我想用工厂创建对象。显然我可以这样写:

if(string.equals("Information1")){
  Factory.createInformation1Object();
}
if(string.equals("Information2")){
  Factory.createInformation2Object();
}
if(string.equals("Information3")){
  Factory.createInformation3Object();
}

现在我想知道是否有更好(更漂亮)的方法来做到这一点。我真的很喜欢访问者模式的多重调度理念,但我看不出有一种方法可以轻松地将其应用于这个特定问题。

【问题讨论】:

  • 您可能可以将“信息[0-9]”之类的正则表达式与匹配器一起使用?但我没有更好的办法。

标签: java string conditional-statements


【解决方案1】:

最好使用 switch-case,因为不需要检查第一次或第二次检查是否为真。 在默认部分中,您可以放置​​其他活动,例如抛出异常等。

【讨论】:

    【解决方案2】:

    您可以使用abstract factory pattern

    创建一个抽象的Factory 类[或接口],以及扩展它的类:MyObject1FactoryMyObject2Factory、...

    在预处理时,将 String 中的 Map<String,Factory> 填充到对应的 Factory 实例中,这在您的应用程序中只执行一次。

    当您需要创建新实例时 - 调用 map.get(string).create() 以创建相关类型的相关对象。

    编辑:带代码的小例子:
    您的课程是:

    public static class MyBase { 
        @Override
        public String toString() {
            return "Base";
        }
    }
    public static class Class1 extends MyBase { 
        @Override
        public String toString() {
            return "Class1";
        }
    }
    public static class Class2 extends MyBase { 
        @Override
        public String toString() {
            return "Class2";
        }
    }
    

    您的工厂将是:

    public static abstract class MyFactory {
        public abstract MyBase build();
    }
    public static class MyFactory1 extends MyFactory {
        @Override
        public Class1 build() {
            return new Class1();
        }
    }
    public static class MyFactory2 extends MyFactory {
        @Override
        public Class2 build() {
            return new Class2();
        }
    }
    

    在程序生命周期内仅填充一次地图:

        Map<String,MyFactory> map = new HashMap<String, Test.MyFactory>();
        map.put("class1", new MyFactory1());
        map.put("class2", new MyFactory2());
    

    当你需要一个新对象时,调用:

        MyBase obj = map.get(s).build();
        System.out.println(obj);
    

    (*) 注意:类的 static 关键字在这里是因为我将它们创建为内部类 - 当然,如果不是你的情况,你需要省略它......

    【讨论】:

      【解决方案3】:

      您可以在 Java 7 中新使用switch 语句。here

      【讨论】:

        【解决方案4】:

        我更喜欢功能性和可读性。 :-) 如果 string 为 null 并且调用它的方法肯定会抛出 NPE,请考虑以下内容,

        "Information1".equals(strings)
        

        也许Information1、Information2和Information3可以作为类静态变量放置,这样可以很容易地引用并防止人为错误。

        【讨论】:

        • 我今天又得到了一个新昵称!
        【解决方案5】:

        在 Java 7 中,您现在可以在 switch 语句中使用字符串。

        请注意,您的代码并不直接类似于 switch 语句,因为理论上可以通过查看代码结构来调用所有三个工厂方法(例如,没有 else 语句)。但实际上这不可能发生,因为string 不能同时具有所有三个值。

        【讨论】:

        • 在可读性和可用性方面,使用 switch 语句真的会更好吗?我仍然会在一个地方有大量代码,除了我有 cases 而不是 ifs
        • 完全取决于您的要求!我将问题解释为与字符串处理有关(因为这是主题所暗示的),而其他人则将其解释为与整体设计、模式等有关。
        • 换句话说,从设计的角度来看,不,它并没有实质性地改善问题。
        猜你喜欢
        • 1970-01-01
        • 2013-09-11
        • 2011-01-22
        • 2012-01-21
        • 1970-01-01
        • 2011-12-15
        • 1970-01-01
        • 2018-06-12
        相关资源
        最近更新 更多