2011-02-28 36 views
11

的整数我有这样指针在Java

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

回答

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; 
+0

为什么你会使用自己的类而不是使用'Integer'类? – ubadub

+1

@ubadub整数(和其他内置的原始框类)是不可变的。当你只是希望能够在泛型中使用它时,这很好,但如果你想能够改变多个地方的值,那就不好了。也就是说,还有'AtomicInteger'类,它可以在线程之间安全共享(但由于它必须确保正确的多线程行为,所以速度较慢)。 –

1

使用Integer类而不是int。

要使用的代码给你举个例子,你有:

Integer a,b; 
Integer p; 
switch(whatever){ 
    case 1: 
     p=a; 
    case 2: 
     p=b; 
} 
+0

你能用Integer类重写我的代码吗?我无法弄清楚如何使用它:s – bluehallu

+7

我不认为这会让你获益。整数是不变的。 – DJClayworth

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(这是一个普遍原则:尽可能多地给出尽可能少的访问权限)。

+0

那么,这是我的例子的另一个解决方案,我的错误是没有考虑最好的一个,但不能按我的方式完成?我的意思是,有没有像Java中的Integer指针那样的东西? – bluehallu

+0

@Hallucynogenyc:在Java中没有指向'int'的指针。指针只存在于引用类型(即不适用于原始类型),在这种情况下,它们通常被称为引用(警告:它们不像C引用,尽管!)。而且'int'的标准包装是不可变的,因此引用它并不能真正起到帮助作用。你可以使用一个可变的AtomicInteger。你会很“滥用”它,你的代码会看起来不太整洁(因为赋值需要set()调用而不是简单的'=')。 –

+0

我的情况的真实情况是我需要处理的int是一个类变量,它模拟一个指针,它是作业,它需要在Java中。我不需要这个值,那些行直接修改那个变量。我不能使用方法,因为它可以读取值,但有些行需要修改该整数。现在好多了? – bluehallu

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

实际上它被称为“一种方法”;-) –

+0

但是... Java没有功能!我们不要混淆C语言家伙! :O – corsiKa

+0

@Joachim,@ glowcoder:当然,固定。谢谢。 – unwind

1

为什么你就不能这样做:

int a,b; 

Switch(whatever){ 
    case 1: 
     f(a); 
     break; 
    case 2: 
     f(b); 
     break; 
    default: 
     // ??? 
} 
1

Java没有指针,它引用。

指针是一个包含内存地址的变量。通常,取消引用指针以获取某些操作所需的内存。

引用是内存管理表的索引。通常情况下,内存管理表受到直接访问保护。在Java的情况下,引用不能被手动操作,因为任何对变量的读取都会导致返回引用的对象。

这有很多暗示,但是对于像样的自动垃圾收集来说是必要的。垃圾收集有时涉及在内存中移动对象以创建更大的可用空间区域(对于不适合当前内存空间的需要的对象)。如果Java暴露了一个指针,那么在内存压缩之后,您可能会拥有内存的“旧”地址。

通过使用引用,即使内存的实际位置四处移动,也可以保证引用保持不变。 JVM内部是对指针表的引用,但是您永远不会从正在运行的程序中看到它;因为如果你曾经碰过它,它会搞乱自动内存管理。

+2

更具体地说,Java具有对象引用。它没有原始类型引用。 –

+0

如果Java没有指针,为什么它有'NullPointerException'? ;-)但严重的是,即使是[JLS(§4.3.1)](http://java.sun.com/docs/books/jls/third_edition/html/typesValues.html#4.3.1)调用说:“引用值(通常只是*引用*)是指向这些对象的指针[..]“。 –

+0

因为有人搞错了班级的名字。参考文献很像指针,但与其他文章不同 - 包括不幸的是您想要使用它们的方式。 – DJClayworth

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; 

可是真的。方法!