Java中有效且漂亮的字符串条件
我有一个关于代码风格的问题: 让我们假设我有一个包含一些信息的字符串(比如“Information1”或“Information2”)。基于此,我想用工厂创建对象。显然,我可以这样写: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
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依赖于您所要求的内容!我把这个问题解释为关于字符串处理(因为这是主题所暗示的),而其他人则把它解释为关于整体设计、模式等。换句话说,从设计的角度来看,不,它并没有实质性地改善问题。今天,我又得到了一个新的刻痕!今天我又得了一个新尼克!