指向Java中的整数的指针

时间:2011-02-28 16:30:58

标签: java pointers int

我有这样的代码

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中包含两个链接列表。我所说的整数是指向列表开头的指针,在向列表中添加或删除元素时,我需要移动到列表的其他位置

7 个答案:

答案 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;

但是真的。方法!