2011-02-28 30 views
11

Tôi có một mã như thế nàyPointer đến một Integer trong Java

int a,b; 
switch(whatever){ 
    case 1: 
     lots_of_lines_dealing_with_variable_a; 
    case 2: 
     same_lines_but_dealing_with_variable_b; 
} 

Tôi nghĩ làm:

int a,b; 
pointer_to_int p; 
switch(whatever){ 
    case 1: 
     p=a; 
    case 2: 
     p=b; 
} 
lots_of_lines_dealing_with_pointer_p; 

Nó sẽ làm giảm các mã xuống còn khoảng một nửa dòng, nhưng Java không cho phép con trỏ đến số nguyên. Vì vậy, có cách nào để tiếp cận điều này?

Chỉnh sửa: Bài tập về nhà lớn hơn nhiều so với phương pháp này. Tôi cần tạo một lớp có tên là "Danh sách đôi" chứa hai danh sách được liên kết trong một Vector đơn lẻ. Các số nguyên tôi nói đến là các con trỏ để bắt đầu Danh sách, mà tôi cần chuyển sang các vị trí khác của Danh sách khi thêm hoặc xóa các phần tử vào Danh sách

Trả lời

5

Bạn có thể thử sử dụng quyền anh.

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

Tại sao bạn sẽ sử dụng hộp của riêng bạn thay vì sử dụng lớp 'Integer'? – ubadub

+1

@ubadub Integer (và các lớp hộp nguyên thủy tích hợp khác) không thay đổi. Đó là tốt khi bạn chỉ muốn có thể sử dụng nó trong generics, nhưng không phải nếu bạn muốn để có thể biến đổi giá trị từ nhiều nơi. Điều đó nói rằng, cũng có lớp 'AtomicInteger', có thể được chia sẻ an toàn giữa các luồng (nhưng chậm hơn vì nó phải đảm bảo hành vi đa luồng chính xác). –

1

Sử dụng lớp Integer thay vì int.

Để cung cấp cho bạn một ví dụ sử dụng mã bạn có:

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

Bạn có thể viết lại mã của mình bằng lớp Integer không? Tôi không thể tìm ra cách sử dụng nó: s – bluehallu

+7

Tôi không nghĩ rằng điều này giúp bạn đạt được điều gì. Số nguyên là không thay đổi. – DJClayworth

19

Có lẽ tôi đang thiếu cái gì, nhưng trông dễ dàng giải quyết được với tôi:

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; 
} 

Nếu bạn không cần phải sửa đổi các biến, sau đó bạn có thể bỏ qua giá trị trả lại (chỉ cần sử dụng void) và gán.

Nếu không có gì khác cần gọi phương thức, thì phải là private (nguyên tắc chung: cung cấp càng ít quyền truy cập càng tốt, càng nhiều càng tốt).

+0

Vâng, đó là một giải pháp khác cho ví dụ của tôi, lỗi của tôi vì không suy nghĩ một cách tốt nhất, nhưng nó không thể được thực hiện theo cách của tôi? Tôi có nghĩa là, không có bất cứ điều gì giống như một con trỏ đến một số nguyên trong Java? – bluehallu

+0

@ Hallucynogenyc: không có thứ gì như một con trỏ tới một 'int' trong Java. Con trỏ chỉ tồn tại đối với các kiểu tham chiếu (nghĩa là không phải cho kiểu nguyên thủy) trong trường hợp chúng thường được gọi là tham chiếu (Cảnh báo: chúng không hoạt động như tham chiếu C). Và trình bao bọc tiêu chuẩn cho 'int' là không thay đổi, do đó, có một tham chiếu đến nó không thực sự hữu ích. Bạn có thể sử dụng 'AtomicInteger' có thể thay đổi được. Bạn sẽ là loại "lạm dụng" nó và mã của bạn sẽ trông gọn gàng hơn rất nhiều (vì nhiệm vụ cần một cuộc gọi 'set()' thay vì một '=') đơn giản. –

+0

Tình huống thực tế trong trường hợp của tôi là int mà tôi cần phải giải quyết là một biến lớp mô phỏng một con trỏ, đó là bài tập về nhà và nó cần phải có trong Java. Tôi không cần giá trị chỉ, những dòng đó đang trực tiếp sửa đổi biến đó. Tôi không thể sử dụng một phương thức vì nó sẽ làm việc để đọc giá trị, nhưng có những dòng cần sửa đổi số nguyên đó. Tốt hơn rồi? – bluehallu

4

Vâng, nó được gọi là "một phương pháp":

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

Thực ra nó được gọi là "một phương thức" ;-) –

+0

nhưng ... Java không có chức năng! Đừng đi nhầm lẫn với anh chàng C! : O – corsiKa

+0

@Joachim, @glowcoder: Đúng tất nhiên, đã được sửa. Cảm ơn. – unwind

1

Tại sao có thể không chỉ cần làm:

int a,b; 

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

Java không có con trỏ, nó có tài liệu tham khảo.

Con trỏ là biến chứa địa chỉ bộ nhớ. Thông thường một dereferences con trỏ để có được bộ nhớ cần thiết cho một số hoạt động.

Tham chiếu là chỉ mục trong bảng quản lý bộ nhớ. Thông thường, bảng quản lý bộ nhớ được bảo vệ khỏi truy cập trực tiếp. Trong trường hợp của Java, tham chiếu không thể được thao tác thủ công, vì mọi đọc của biến sẽ dẫn đến trả về đối tượng được tham chiếu.

Điều này có rất nhiều ý nghĩa, nhưng cần thiết cho việc thu gom rác tự động. Việc thu gom rác đôi khi liên quan đến việc di chuyển các đối tượng trong bộ nhớ để tạo ra các vùng không gian trống lớn hơn (đối với các đối tượng cần thiết không thể vừa với các lỗ bộ nhớ hiện tại). Nếu Java tiếp xúc với một con trỏ, sau đó sau khi nén bộ nhớ, bạn có thể có địa chỉ "cũ" của bộ nhớ.

Bằng cách sử dụng tham chiếu, tham chiếu của bạn được đảm bảo giữ nguyên, ngay cả khi vị trí thực tế của bộ nhớ di chuyển xung quanh. Nội bộ cho JVM là một tham chiếu đến bảng con trỏ, nhưng bạn sẽ không bao giờ thấy nó từ một chương trình đang chạy; bởi vì, nếu bạn đã từng chạm vào nó, nó sẽ làm hỏng việc quản lý bộ nhớ tự động.

+2

Cụ thể hơn, Java có các tham chiếu đối tượng. Nó không có tham chiếu kiểu nguyên thủy. –

+0

Nếu Java không có con trỏ, tại sao nó có 'NullPointerException'? ;-) Nhưng nghiêm túc, ngay cả cuộc gọi [JLS (§4.3.1)] (http://java.sun.com/docs/books/jls/third_edition/html/typesValues.html#4.3.1) nói "The giá trị tham chiếu (thường chỉ * tham chiếu *) là con trỏ tới các đối tượng này [..] ". –

+0

Bởi vì ai đó đã sửa đổi tên của một lớp học. Tài liệu tham khảo giống như con trỏ trong một vài ngày, nhưng không giống chúng ở những người khác - bao gồm cả cách bạn muốn sử dụng chúng. – DJClayworth

0

Vâng, đối với kịch bản này:

boolean useA; 
int a, b; 

if(useA) 
     lots_of_lines_dealing_with_variable_a; 
else 
     same_lines_but_dealing_with_variable_b; 

bạn có thể sử dụng:

boolean useA; 
int a, b; 

int value = useA ? a : b; 

// lines_dealing_with_value 

if(useA) 
    a = value; 
else 
    b = value; 

Nhưng thực sự. Phương pháp!