2011-11-22 40 views
6

Tôi có một ứng dụng java tạo hai đối tượng tĩnh trong một lớp cơ sở, các đối tượng này cần tham chiếu trong suốt các lớp trong chương trình.Tham chiếu đối tượng tĩnh được tạo trong một lớp trong toàn bộ ứng dụng

public class Baseclass{ 
    public static ClassA A = new ClassA(); 
    public static ClassB B = new Classb(); 
    ... 
    ... 
    ... 
} 

Các đối tượng này được tham chiếu trong các lớp khác dưới dạng biến riêng tư cục bộ.

public class ClassA{ 
    private ClassB b = Baseclass.B; 

Tuy nhiên, cả hai đối tượng yêu cầu lẫn nhau để tạo ra một biến thể mới của một đối tượng trước khi tạo khác, biến cục bộ trong các lớp "trên" được đặt thành rỗng. Có bất kỳ khái niệm nào trong Java có thể tham chiếu đến đối tượng thực tế (giống như một con trỏ) đến đối tượng dưới dạng biến thay vì tạo bản sao của đối tượng không?

+4

Talk về thiết kế xấu .. – mre

+0

(ObPlead: Xin vui lòng, xin vui lòng, xin vui lòng không sử dụng statics mutable (trước đây gọi là globals). Và bao gồm việc sử dụng các antipattern singleton.) –

Trả lời

6

Tôi nghĩ câu trả lời bạn đang tìm kiếm là một "mẫu đơn". Đây là nơi bạn chỉ tạo một thể hiện của một lớp để sử dụng ở những nơi khác. Đây là good link to read. Đây là wikipedia page on it với một số ví dụ java.

Vì vậy, mã của bạn sẽ trông như thế này:

public class A { 
    private final static A instance = new A(); 

    /* private constructor forces you to use the getInstance() method below */ 
    private A() {} 

    public static A getInstance() { 
     return instance; 
    } 
} 

Sau đó, bất cứ nơi nào bạn muốn để có được một thể hiện của A bạn sẽ làm điều gì đó như:

public class B { 
    private final A classA = ClassA.getInstance(); 
    ... 
} 

Không có lý do tại sao A thể cũng không có một thể hiện của B và gọi phương thức của B theo các phương pháp riêng của nó. Những gì bạn không thể làm với sự phụ thuộc chéo này là gọi bất kỳ phương thức nào khác trong phương thức khởi tạo.

Nói chung, bằng cách này, các mẫu này nên được sử dụng một cách tiết kiệm. Một cách tốt hơn để thực hiện điều này là thông qua tiêm phụ thuộc thay vì tham chiếu toàn cầu. Cross tiêm là có thể nhưng một lần nữa, nó nên được sử dụng một cách tiết kiệm. Một giải pháp tốt hơn là tái cấu trúc các lớp để có các phụ thuộc tuyến tính.

Có khái niệm nào trong Java có thể tham khảo đối tượng thực tế (như con trỏ) với đối tượng dưới dạng biến thay vì tạo bản sao của đối tượng không?

Java là đi qua giá trị nhưng giá trị của bất kỳ đối tượng là các tham chiếu đến các đối tượng (tương tự như con trỏ trong C mặc dù họ là không một địa chỉ bộ nhớ). Vì vậy, nếu bạn có một thể hiện của A và gán nó cho một trường khác, trường đó sẽ có cùng giá trị và sẽ tham chiếu cùng một phiên bản A.

// instantiate a new instance of A 
A a1 = new A(); 
// assign the reference to A to another variable 
a2 = a1; 
// they are equivalent and both reference the same object 
if (a1 == a2) ... 
1

Có khái niệm nào trong Java có thể tham khảo đối tượng thực tế (như con trỏ) với đối tượng dưới dạng biến thay vì tạo bản sao của đối tượng không?

Thực tế, Java chỉ có tham chiếu. Biến số không thể chứa đối tượng, do đó bạn không phải lo lắng.

Ngoài ra, thay vì làm

private ClassB b = Baseclass.B; 

tôi muốn đề nghị bạn xem xét thực hiện một khẩu tĩnh:

import static some.package.Baseclass.*; 
+0

Tôi đã chỉnh sửa bài đăng gốc để làm cho dòng 'private classB' chính xác về cú pháp. Ngay sau khi chỉnh sửa của tôi được chấp nhận anyway ... –

1

Khi bạn thực hiện một tài liệu tham khảo trong Java bạn đang thực sự làm cho một bản sao của một tài liệu tham khảo . Bạn không sao chép Baseclass.B trong ví dụ của mình. Bạn đang sao chép tài liệu tham khảo đến Baseclass.B.

Trong mã ví dụ bạn đã cung cấp, b sẽ bị vô hiệu cho đến khi Baseclass.B được xác định. Nếu bạn cần thực hiện một thao tác trên b, bạn không thể thực hiện điều đó trong tuyên bố ClassA. Bạn cần phải làm điều đó trong một phương thức được gọi sau khi đối tượng a đã được tạo.

0

Đây là ứng dụng cổ điển dành cho singleton.

Đối với mỗi một:

  • Tận dụng tin constructor.
  • Thêm thành viên tĩnh riêng tư của loại riêng của lớp học để giữ singleton.
  • Thêm phương thức "getThe()" để khởi tạo thành viên ở trên nếu nó chưa được đặt.

Xem wikipedia:Singleton pattern.

Tạo hàm tạo của cấu trúc A cũng bằng cách thực hiện getThe() trên đó.

Ngoài ra, không sử dụng các trường công khai trong Baseclass; thay vào đó sử dụng các phương thức getter công cộng. Đừng giữ một biến B riêng biệt; thay vào đó, hãy yêu cầu A Singleton cho nó.

0

Có bất kỳ khái niệm trong Java mà sẽ tham khảo các đối tượng thực tế (như một con trỏ) cho các đối tượng như là một biến thay vì làm một bản sao của đối tượng?

Khi bạn làm điều này:

private ClassB b = Baseclass.B; 

Thực sự bạn đang Ponting tại cùng một đối tượng một đó là vì "b" biến được đặt tên biến tham chiếu.

Về câu hỏi của bạn, recomendation của tôi là làm một cái gì đó như thế này:

encapsule Đầu tiên là tài liệu tham khảo:

public class ClassA{ 
    private ClassB b; 

    public void setB(ClassB b) { 
     this.b = b; 
    } 

    public ClassB getB(ClassB b) { 
     return this.b; 
    } 

} 

Thứ hai sử dụng một khối tĩnh cho init các biến:

public class Baseclass{ 
    public static ClassA A = new ClassA(); 
    public static ClassB B = new Classb(); 
    static { 
     A.setB(B); 
     B.setA(A); 
    } 
} 
Các vấn đề liên quan