我有这样的代码
int a,b;
switch(whatever){
case 1:
lots_of_lines_dealing_with_variable_a;
case 2:
same_lines_but_dealing_with_variable_b;
}
我想到了:
int a,b;
pointer_to_int p;
switch(whatever){
case 1:
p=a;
case 2:
p=b;
}
lots_of_lines_dealing_with_pointer_p;
它会将代码减少到大约一半的行,但Java不允许指向整数。那么,有什么方法可以解决这个问题吗?
编辑:作业比这个方法要大得多。我需要创建一个名为“DoubleList”的类,它在一个Vector中包含两个链接列表。我所说的整数是指向列表开头的指针,在向列表中添加或删除元素时,我需要移动到列表的其他位置
答案 0 :(得分:19)
也许我错过了什么,但看起来很容易解决:
int a,b;
switch(whatever) {
case 1:
a = manipulateValue(a);
break;
case 2:
b = manipulateValue(b);
break;
}
int manipulateValue(int v) {
// lots of lines dealing with variable v
return v;
}
如果您不需要修改变量,那么您可以省略返回值(仅使用void
)和赋值。
如果没有其他方法需要调用该方法,那么它应该是private
(这是一般原则:尽可能少地提供访问权限。)
答案 1 :(得分:5)
你可以尝试使用拳击。
public class IntBoxer {
public IntBoxer() {
}
public IntBoxer(int startValue) {
this.value = startValue;
}
public int value;
}
IntBoxer a = new IntBoxer();
IntBoxer b = new IntBoxer();
IntBoxer p;
Switch(whatever){
case 1:
p=a;
break;
case 2:
p=b;
break;
}
lots_of_lines_dealing_with_pointer_p.value;
答案 2 :(得分:4)
是的,它被称为“方法”:
private int lots_of_lines_dealing_with_value(int x)
{
.
.
.
return new_value;
}
int a,b;
Switch(whatever){
case 1:
p=lots_of_lines_dealing_with_value(a);
break;
case 2:
p=lots_of_lines_dealing_with_value(b);
break;
}
答案 3 :(得分:1)
使用Integer类而不是int。
使用您拥有的代码为您举例:
Integer a,b;
Integer p;
switch(whatever){
case 1:
p=a;
case 2:
p=b;
}
答案 4 :(得分:1)
为什么你不能这样做:
int a,b;
Switch(whatever){
case 1:
f(a);
break;
case 2:
f(b);
break;
default:
// ???
}
答案 5 :(得分:1)
Java没有指针,它有引用。
指针是包含内存地址的变量。通常,一个取消引用指针以获取某些操作所需的内存。
引用是内存管理表的索引。通常,保护存储器管理表免受直接访问。在Java的情况下,无法手动操作引用,因为对变量的任何读取都将导致返回引用的对象。
这有很多含义,但对于体面的自动垃圾收集是必要的。垃圾收集有时涉及在内存中移动对象以创建更大的可用空间区域(对于无法放入当前内存孔的所需对象)。如果Java暴露了一个指针,那么在内存压缩之后,你可能会得到内存的“旧”地址。
通过使用引用,即使内存的实际位置移动,也可以保证您的引用保持不变。 JVM的内部是对指针表的引用,但是你永远不会从正在运行的程序中看到它;因为,如果你碰过它,就会搞乱自动内存管理。
答案 6 :(得分:0)
嗯,对于这种情况:
boolean useA;
int a, b;
if(useA)
lots_of_lines_dealing_with_variable_a;
else
same_lines_but_dealing_with_variable_b;
你可以使用:
boolean useA;
int a, b;
int value = useA ? a : b;
// lines_dealing_with_value
if(useA)
a = value;
else
b = value;
但是真的。方法!