2011-02-28 74 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; 

可是真的。方法!