Java中有效且漂亮的字符串条件

Java中有效且漂亮的字符串条件,java,string,conditional-statements,Java,String,Conditional Statements,我有一个关于代码风格的问题: 让我们假设我有一个包含一些信息的字符串(比如“Information1”或“Information2”)。基于此,我想用工厂创建对象。显然,我可以这样写: if(string.equals("Information1")){ Factory.createInformation1Object(); } if(string.equals("Information2")){ Factory.createInformation2Object(); } if(stri

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

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

if(string.equals("Information1")){
  Factory.createInformation1Object();
}
if(string.equals("Information2")){
  Factory.createInformation2Object();
}
if(string.equals("Information3")){
  Factory.createInformation3Object();
}
现在我想知道是否有更好(更漂亮)的方法来做到这一点。我非常喜欢访问者模式的多分派思想,但我看不到一种方法可以轻松地将其应用于这个特定问题。

您可以使用

创建一个抽象的
工厂
类[或接口],以及扩展它的类:
MyObject1Factory
MyObject2Factory

在预处理时,将
映射
字符串
填充到相应的
工厂
实例,这在应用程序中只执行一次

需要创建新实例时,请调用
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());
(*)注意:这里是类的static关键字,因为我将它们创建为内部类-当然,如果不是您的情况,您需要使用它….

您可以使用

创建一个抽象的
工厂
类[或接口],以及扩展它的类:
MyObject1Factory
MyObject2Factory

在预处理时,将
映射
字符串
填充到相应的
工厂
实例,这在应用程序中只执行一次

需要创建新实例时,请调用
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());

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

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


请注意,您的代码与switch语句没有直接关系,因为理论上,只要查看代码的结构(例如no
else
语句),就可以调用所有三个工厂方法。但在实践中,这是不可能的,因为
string
不能同时拥有这三个值。

在Java7中,现在可以在switch语句中使用字符串


请注意,您的代码与switch语句没有直接关系,因为理论上,只要查看代码的结构(例如no
else
语句),就可以调用所有三个工厂方法。但实际上这是不可能的,因为
string
不能同时拥有这三个值。

我更喜欢功能性和可读性。:-)如果String为NULL,并调用它的方法肯定会抛出NPE,那么请考虑下面的,

"Information1".equals(strings)

也许可以将Information1、Information2和Information3作为类静态变量,这样就可以方便地引用并防止人为输入错误。

我更喜欢功能性和可读性。:-)如果String为NULL,并调用它的方法肯定会抛出NPE,那么请考虑下面的,

"Information1".equals(strings)

也许可以将Information1、Information2和Information3作为类静态变量,这样就可以方便地引用并防止人为输入错误。

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

您可以在Java7中新使用
switch
语句

最好使用switch case,因为不必要检查第一个或第二个检查是否为true。
在默认区域中,您可以放置其他活动,如异常抛出等

最好使用switch case,因为不必要检查第一个或第二个检查是否为true。
在默认区域中,您可以放置其他活动,如异常抛出等

你可能会使用一个正则表达式,比如“信息[0-9]”和一个匹配器?但我没有更好的方法。你可能会用一个正则表达式,比如“信息[0-9]”和一个匹配器?但我没有更好的方法。使用switch语句在可读性和可用性方面真的会更好吗?我仍然会在一个地方有大量的代码,除非我有
case
s而不是
if
s依赖于您所要求的内容!我将这个问题解释为关于字符串处理(因为这是主题所暗示的),而其他人则将其解释为关于总体设计、模式等。换句话说,从设计角度来看,不是,在可读性和可用性方面,使用switch语句真的会更好吗?我仍然会在一个地方有大量的代码,除非我有
case
s而不是
if
s依赖于您所要求的内容!我把这个问题解释为关于字符串处理(因为这是主题所暗示的),而其他人则把它解释为关于整体设计、模式等。换句话说,从设计的角度来看,不,它并没有实质性地改善问题。今天,我又得到了一个新的刻痕!今天我又得了一个新尼克!