在Java1.6中以优雅的方式切换字符串
我使用的是Java1.6,我知道从Java1.7可以选择打开字符串 但是在这里我使用if/elseif来路由类型名,我的问题是是否有一种优雅的方式 我能把它改成开关吗在Java1.6中以优雅的方式切换字符串,java,switch-statement,Java,Switch Statement,我使用的是Java1.6,我知道从Java1.7可以选择打开字符串 但是在这里我使用if/elseif来路由类型名,我的问题是是否有一种优雅的方式 我能把它改成开关吗 public static SwitchType<?> switchT(final String typeName, final String memberName) { if (typeName.equals("java.lang.St
public static SwitchType<?> switchT(final String typeName,
final String memberName) {
if (typeName.equals("java.lang.String")) {
return new SwitchInputType<String>(new String(memberName + " "));
} else if (typeName.equals("char")) {
return new SwitchInputType<Character>(new Character('a'));
} else if (typeName.equals("decimal") ||
typeName.equals("java.math.BigDecimal")) {
return new SwitchInputType<BigDecimal>(new BigDecimal("34.58"));
} else if (typeName.equals("boolean")) {
}
public static SwitchType switchT(最终字符串类型名,
最终字符串(名称){
if(typeName.equals(“java.lang.String”)){
返回新的SwitchInputType(新字符串(memberName+“”));
}else if(typeName.equals(“char”)){
返回新的SwitchInputType(新字符('a'));
}else if(typeName.equals(“decimal”)||
typeName.equals(“java.math.BigDecimal”)){
返回新的SwitchInputType(新的BigDecimal(“34.58”);
}else if(typeName.equals(“布尔”)){
}
许多模式都可用,从使用枚举到使用映射
,但没有一种模式比这种情况下的模式更简洁、更快。只有更多的代码依赖于此类型名
才能使用映射
:
公共接口开关类型工厂{
SwitchType创建(字符串成员名);
}
...
私有静态映射工厂=新HashMap();
静止的{
put(“java.lang.String”,新的SwitchTypeFactory(){
@凌驾
公共开关类型创建(字符串成员名称){
返回新的SwitchInputType(memberName+“”);
}
});
factories.put(“char”,新的SwitchTypeFactory(){
@凌驾
公共开关类型创建(字符串成员名称){
返回新的SwitchInputType(Character.valueOf('a'))
}
});
...
}
公共静态SwitchType switchT(最终字符串类型名、最终字符串成员名){
返回工厂.get(typeName).create(memberName);
}
尽管使用enum
可能有点违反直觉,但在这方面已经证明它非常强大
每个enum
都有一个valueOf(String)
方法,该方法为该名称返回一个元素。然后,您可以在switch语句中使用检索到的元素。唯一难看的部分是valueOf(String)
抛出一个IllegalArgumentException
。因此捕获这相当于默认情况
enum Type{
JAVA_LANG_STRING;
CHAR;
DECIMAL;
BOOLEAN;
JAVA_LANG_BIGDECIMAL;
}
public static SwitchType<?> switchT(final String typeName,
final String memberName) {
try{
Type t = Type.valueOf(typeName.toUppercase().replace(".","_"));
switch(t){
case Type.JAVA_LANG_STRING: return new SwitchInputType<String>(new String(memberName + " "));
case Type.CHAR: return new SwitchInputType<Character>(new Character('a'));
case Type.DECIMAL:
case Type.JAVA_MATH_BIGDECIMAL: return new SwitchInputType<BigDecimal>(new BigDecimal("34.58"));
}catch(IllegalArgumentException e){
//default case
}
}
枚举类型{
JAVA_LANG_字符串;
烧焦
十进制的
布尔型;
JAVA_LANG_BIGDECIMAL;
}
公共静态SwitchType switchT(最终字符串类型名,
最终字符串(名称){
试一试{
Type t=Type.valueOf(typeName.toUppercase().replace(“.”,“”);
开关(t){
case Type.JAVA_LANG_STRING:返回新的SwitchInputType(新字符串(memberName+“”));
case Type.CHAR:返回新的SwitchInputType(新字符('a'));
case Type.DECIMAL:
case Type.JAVA_MATH_BIGDECIMAL:返回新的SwitchInputType(新的BIGDECIMAL(“34.58”);
}捕获(IllegalArgumentException e){
//默认情况
}
}
枚举也可以实现接口。通过为每个元素提供一个实现或一个全局实现
interface SwitchInputTypeFacotry {
SwitchInputType get(String arg);
}
enum TypeName implements SwitchInputTypeFacotry{
CHAR{
SwitchInputType get(String arg){
return new SwitchInputType<Character>(new Character('a'));
}
}
[...]
}
public static SwitchType<?> switchT(final String typeName,
final String memberName) {
try{
SwitchInputTypeFacotry t = Type.valueOf(typeName.toUppercase().replace(".","_"));
return t.get(memberName);
}catch(IllegalArgumentException e){
//default case
}
}
界面切换InputTypeFacotry{
SwitchInputType获取(字符串参数);
}
enum TypeName实现SwitchInputTypeFacotry{
煤焦{
SwitchInputType获取(字符串参数){
返回新的SwitchInputType(新字符('a'));
}
}
[...]
}
公共静态SwitchType switchT(最终字符串类型名,
最终字符串(名称){
试一试{
SwitchInputTypeFacotry t=Type.valueOf(typeName.toUppercase().replace(“.”,“”);
返回t.get(memberName);
}捕获(IllegalArgumentException e){
//默认情况
}
}
第二种方法使扩展功能变得非常容易(只要它停留在一个模块中,就不可能使用枚举进行子类化)。您能提供一个例子吗?@JeanTennie JB Nizet刚刚做了。谢谢,静态应该在新类中?您刚刚编写的是什么意思static@JeanTennie1)第2)条“静态{…}”是静态初始值设定项。请查找它。
interface SwitchInputTypeFacotry {
SwitchInputType get(String arg);
}
enum TypeName implements SwitchInputTypeFacotry{
CHAR{
SwitchInputType get(String arg){
return new SwitchInputType<Character>(new Character('a'));
}
}
[...]
}
public static SwitchType<?> switchT(final String typeName,
final String memberName) {
try{
SwitchInputTypeFacotry t = Type.valueOf(typeName.toUppercase().replace(".","_"));
return t.get(memberName);
}catch(IllegalArgumentException e){
//default case
}
}