Java 如何在两个函数中避免相同的逻辑。
我不想重复一段特定的代码,需要关于如何更好地构造它的建议Java 如何在两个函数中避免相同的逻辑。,java,Java,我不想重复一段特定的代码,需要关于如何更好地构造它的建议 public static final int TAB_A= 0; public static final int TAB_B= 2; public static final int TAB_C= 3; public static final int NO_TAB = -1; public String getTabName() { switch (getTabId()) { case TAB_A:
public static final int TAB_A= 0;
public static final int TAB_B= 2;
public static final int TAB_C= 3;
public static final int NO_TAB = -1;
public String getTabName() {
switch (getTabId()) {
case TAB_A:
return "TA";
case TAB_B:
return "TB";
case TAB_C:
return "TC";
default:
return "NT";
}
}
public string execute() {
setResults(getTabName());
}
public int getUserCount() {
SomeVO vo = (SomeVO) getFirstResultSet().get(0);
switch (getTabId()) {
case TAB_A:
return vo.getTabAResults();
case TAB_B:
return vo.getTabBResults();
case TAB_C:
return vo.getTabCResults();
default:
return vo.getSomeStuff();
}
}
我希望能够整合getTabName()
和getUserCount()方法中的逻辑
让switch语句检查相同的内容似乎效率不高,但它们返回的是两个不同的内容….使用一个枚举作为其每个值的向量,获取您需要的值(如“TA”,…),将其存储在向量中,并使用一个方法返回此值
这样你就不需要使用开关了
链接:
我会使用Javaenum
而不是静态int
s和开关
子句。枚举的好处在于,您可以将值严格限制为您声明的值
public enum AnEnum {
VAL_A {
public String getName() { return "A"; }
public int getResult(Thing t) { return t.getResultsA(); }
};
public abstract String getName();
public abstract int getResult(Thing t);
}
同样值得一看的是enums文档我能想到的唯一解决方案是,在简单和不过度设计之间取得平衡(如其中一条评论中所强调的):
这种方法的唯一问题是,所有参数都会被急切地求值,这在您的情况下不是问题,但在其他情况下可能是问题。使用如下枚举:
public static enum TableType {
TAB_A(0, "TA"){
private int _getUserCound(SomeVO vo){
return vo.getTabAResults();
}
},
TAB_B(2, "TB"){
private int _getUserCound(SomeVO vo){
return vo.getTabBResults();
}
},
TAB_C(3, "TC"){
private int _getUserCound(SomeVO vo){
return vo.getTabCResults();
}
},
NO_TAB(-1, "NT"){
private int _getUserCound(SomeVO vo){
return vo.getSomeStuff();
}
};
int id;
String name;
private TableType(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
private abstract int _getUserCound(SomeVO vo);
public int getUserCount(){
SomeVO vo = (SomeVO) getFirstResultSet().get(0);
return _getUserCound(vo);
}
public static TableType fromId(int id){
for (TableType v : values()){
if (v.getId() == id) return v;
}
return NO_TAB;
}
}
public String getTabName() {
return TableType.fromId(getTabId()).getName();
}
public string execute() {
setResults(getTabName());
}
public int getUserCount() {
return TableType.fromId(getTabId()).getUserCount();
}
下面是一个使用enum执行脏工作的示例:
import java.lang.reflect.Method;
public class Test {
public enum TABS {
TAB_A("TA", "getTabAResults"),
TAB_B("TB", "getTabBResults"),
TAB_C("TC", "getTabCResults"),
NO_TAB("NT", "getSomeStuff");
private String name, method;
private TABS(String name, String method) {
this.name = name;
this.method = method;
}
public String getName() {
return name;
}
public int getResults(SomeVO vo) {
int result = -1;
try {
Method m = vo.getClass().getMethod(method);
result = (Integer) m.invoke(vo, (Object[]) null);
} catch (Exception ex) {
ex.printStackTrace();
}
return result;
}
}
static class SomeVO {
public int getTabAResults() {
return 1;
}
public int getTabBResults() {
return 2;
}
public int getTabCResults() {
return 3;
}
public int getSomeStuff() {
return 4;
}
}
public static void main(String[] args) {
SomeVO someVO = new SomeVO();
System.out.println(TABS.TAB_A.getName() + " is "
+ TABS.TAB_A.getResults(someVO));
System.out.println(TABS.TAB_B.getName() + " is "
+ TABS.TAB_B.getResults(someVO));
System.out.println(TABS.TAB_C.getName() + " is "
+ TABS.TAB_C.getResults(someVO));
System.out.println(TABS.NO_TAB.getName() + " is "
+ TABS.NO_TAB.getResults(someVO));
}
}
最好使用bean类并添加属性/操作来访问该类并对其进行修改。您可以进行构造函数注入或Setter注入,我更喜欢Setter注入,它将我的代码与bean解耦
并编写一个返回Bean的方法,在switch中设置Bean和返回Bean中的值。
您实际上是在一个地方维护代码,并将所有数据放在一起。
在我看来,这是最简单的解决办法。希望这对您有所帮助。为选项卡的公共方面创建一个接口或抽象类,然后为每个方面使用实现类。在psuedo代码中:
public abstract class Tab {
public abstract String getTabName();
public abstract int getUserCount();
// ...
}
public final class TabA extends Tab {
private static final String NAME = "TA";
// ...
@Override
public String getTabName() {
return NAME;
}
@Override
public int getUserCount() {
SomeVO vo = (SomeVO)getFirstResultSet().get(0);
return vo.getResults();
}
}
您可以使用enum来维护它们的列表,但在将实现逻辑放入enum时要小心。这样做有什么不对?它们返回两种不同的数据类型,因此需要两个函数。@Doug,据我所知什么都没有。我能想到的唯一解决方案是过度工程的典型例子。你可能想使用枚举而不是静态整数,只是把它扔出去(将int currentTab=TAB_A
替换为TAB currentTab=TAB_B
。在我自己的这类问题中,我无耻地使用反射。它实际上与枚举很好地融合在一起。
import java.lang.reflect.Method;
public class Test {
public enum TABS {
TAB_A("TA", "getTabAResults"),
TAB_B("TB", "getTabBResults"),
TAB_C("TC", "getTabCResults"),
NO_TAB("NT", "getSomeStuff");
private String name, method;
private TABS(String name, String method) {
this.name = name;
this.method = method;
}
public String getName() {
return name;
}
public int getResults(SomeVO vo) {
int result = -1;
try {
Method m = vo.getClass().getMethod(method);
result = (Integer) m.invoke(vo, (Object[]) null);
} catch (Exception ex) {
ex.printStackTrace();
}
return result;
}
}
static class SomeVO {
public int getTabAResults() {
return 1;
}
public int getTabBResults() {
return 2;
}
public int getTabCResults() {
return 3;
}
public int getSomeStuff() {
return 4;
}
}
public static void main(String[] args) {
SomeVO someVO = new SomeVO();
System.out.println(TABS.TAB_A.getName() + " is "
+ TABS.TAB_A.getResults(someVO));
System.out.println(TABS.TAB_B.getName() + " is "
+ TABS.TAB_B.getResults(someVO));
System.out.println(TABS.TAB_C.getName() + " is "
+ TABS.TAB_C.getResults(someVO));
System.out.println(TABS.NO_TAB.getName() + " is "
+ TABS.NO_TAB.getResults(someVO));
}
}
public abstract class Tab {
public abstract String getTabName();
public abstract int getUserCount();
// ...
}
public final class TabA extends Tab {
private static final String NAME = "TA";
// ...
@Override
public String getTabName() {
return NAME;
}
@Override
public int getUserCount() {
SomeVO vo = (SomeVO)getFirstResultSet().get(0);
return vo.getResults();
}
}