我知道这听起来很糟糕但是在我的java程序中我有大约100个if-else语句,都包含3个变量,这些变量必须保持对那些if-else块唯一,1是一个标志,用于知道它何时第一次曾经遇到过if-else块,而另外两个都是字符串,并且是临时变量,它们保存上次运行if-else块时使用的数据,因此可以将其与此时运行的数据进行比较,抱歉,如果它听起来很草率,我讨厌有这么多if-else块的想法,但现在我更关心变量,因为如果我为每个块制作3个变量,这是额外的300个变量。关于我可以实现的减少变量数量的任何建议,我有一个想法是所有标志的1个数组,然后是每个if-else块保存2个字符串的2d数组。谢谢牛肉。
编辑:显示前2个if-else块的样本,其他所有块都有相同的代码,只有不同的标志和临时变量ex。 ac101Flag, tempAC101Start, tempAC101End
// AC 101
if (room.equals("FEB 2009") || room.equals("FEB 2011") ||room.equals("FEB 2013") || room.equals("FEB 2015") || room.equals("FEB 2017") ||
room.equals("FEB 2021") || room.equals("FEB 2023") || room.equals("FEB 2025") || room.equals("FEB 2027") || room.equals("FEB 2029")) {
instanceNum = 4;
devID = 130200;
if (ac101Flag == false) {
Delete();
Insert();
ac101Flag = true;
tempAC101Start = Double.parseDouble(finalStart.substring(0, 5).replace(':', '.'));
tempAC101End = Double.parseDouble(finalEnd.substring(0, 5).replace(':', '.'));
}
//Insert();
else if (tempAC101Start <= (Double.parseDouble(finalStart.substring(0, 5).replace(':', '.'))) && tempAC101End >= Double.parseDouble(finalEnd.substring(0, 5).replace(':', '.'))) {
}
else
{
Insert();
tempAC101Start = Double.parseDouble(finalStart.substring(0, 5).replace(':', '.'));
tempAC101End = Double.parseDouble(finalEnd.substring(0, 5).replace(':', '.'));
}
}
// AC 102
else if(room.equals("FEB 1130")) {
instanceNum = 4;
devID = 130400;
if (ac102Flag == false) {
Delete();
Insert();
ac102Flag = true;
tempAC101Start = Double.parseDouble(finalStart.substring(0, 5).replace(':', '.'));
tempAC101End = Double.parseDouble(finalEnd.substring(0, 5).replace(':', '.'));
}
//Insert();
else if (tempAC101Start <= (Double.parseDouble(finalStart.substring(0, 5).replace(':', '.'))) && tempAC101End >= Double.parseDouble(finalEnd.substring(0, 5).replace(':', '.'))) {
}
else
{
Insert();
tempAC101Start = Double.parseDouble(finalStart.substring(0, 5).replace(':', '.'));
tempAC101End = Double.parseDouble(finalEnd.substring(0, 5).replace(':', '.'));
}
}
答案 0 :(得分:2)
编辑:只是为了更具体地说明答案,我想你想要的东西是:
class Foo // Rename this!
{
private double start;
private double end;
private boolean flag;
public void handleValue(double newStart, double newEnd)
{
// Insert code here
}
}
private static void insertFoo(Map<String, Foo> map, String... rooms)
{
Foo foo = new Foo();
for (String room : rooms)
{
map.put(room, foo);
}
}
...
HashMap<String, Foo> map = new HashMap<String, Foo>();
insertFoo(map, "FEB 2009", "FEB 2011", ...);
insertFoo(map, "FEB 1130");
然后在你的循环中,只需使用:
Foo foo = map.get(room);
foo.update(start, end); // Parsed from the current finalStart/finalEnd
如果没有看到您的代码,很难肯定地说,但听起来就像您应该将所有这些封装在数据结构中一样:
if
部分的条件。确切的性质将取决于你有什么然后,您可以浏览这些ConditionBlock
对象的列表(或您选择调用它们的任何对象),并检查当前上下文中的块是否“匹配”,并在适当的位置更新它。
如果你能给我们一个原始代码的小例子,我们可以很容易地为你重构它。
编辑:因为我显然还没有明确为了在一个位置解析而引入局部变量,我会做这样的事情(如 one 第一步):
// TODO: Don't use double here - it's completely inappropriate. Use
// BigDecimal if you absolutely must, but preferrably use a time-related
// type, e.g. something from Joda Time (http://joda-time.sf.net)
double parsedStart = Double.parseDouble(finalStart.substring(0, 5)
.replace(':', '.'));
// TODO: Put all of these constants in a HashSet<String> and use contains
if (room.equals("FEB 2009") ||
room.equals("FEB 2011") ||
room.equals("FEB 2013") ||
room.equals("FEB 2015") ||
room.equals("FEB 2017") ||
room.equals("FEB 2021") ||
room.equals("FEB 2023") ||
room.equals("FEB 2025") ||
room.equals("FEB 2027") ||
room.equals("FEB 2029")) {
instanceNum = 4;
devID = 130200;
// TODO: Change to if (!ac101Flag)
if (ac101Flag == false) {
// TODO: Rename these methods to follow Java naming conventions
Delete();
Insert();
ac101Flag = true;
tempAC101Start = parsedStart;
tempAC101End = parsedEnd;
}
//Insert();
else if (tempAC101Start <= parsedStart && tempAC101End >= parsedEnd) {
}
else
{
Insert();
tempAC101Start = parsedStart;
tempAC101End = parsedEnd;
}
}
答案 1 :(得分:2)
你的问题中不清楚的一个问题是if块的相似程度,无论如何你可能有一个具有共同接口的if块祖先类并采用上面的想法,为每个if块创建一个实例,将状态变量作为对象的一部分,然后创建这些对象的集合,然后循环遍历if块的集合,依次调用每个对象。每个if-block实例都将继承公共变量并且对于对象是唯一的(封装),并且每个块可以为每个if块的每个特殊情况定制代码。
定义每个实例的代码开销会更大,执行时间也会更长,但是你不必创建单独的变量,如果你愿意,你可以动态地混合和匹配if块的顺序。
答案 2 :(得分:1)
声明一个具有三个字段的类。为您需要维护的实例数创建此类的数组。
private class Vars{
int val1;
String val2, val3;
}
private Vars[] allVars = new Vars[300];
void myMethod(){
if (condition1){
allVals[0].val1 = ...;
}
}
答案 3 :(得分:1)
考虑使用多态。
每个块都有行为和数据。因此,使每个块成为实现接口的对象。
每个块对象都可以保存在像@Jon Skeet建议的状态对象上。
首先,选择一个对象。这可能与您现有的if语句有关,或者如果可能,可以通过一些更简单的映射。
然后,只需在您选择的对象上调用该方法。
class BlockState {
boolean hasBeenCalled = false;
String last1;
String last2;
}
class Block1 implements Runnable {
BlockState m_blockState = new BlockState();
public void run() { ... }
}
...
class BlockN implements Runnable {
BlockState m_blockState = new BlockState();
public void run() { ... }
}
...
class LongChainOfIfs
void foo() {
Runnable runnable = null;
if ( ... ) runnable = ...
else if ( ... ) runnable = ...
...
else runnable = ...
runnable.run();
}
}