2012-06-22 24 views
5

Sử dụng ví dụ chung của đối tượng Point (x, y), có cách nào để có nó như là một cấu trúc trong Java 1.4 không? Ưu điểm sẽ là sẽ không có một phân bổ bộ nhớ riêng biệt cho đối tượng Point vì struct sẽ là một phần của đối tượng chứa. Nhưng nó vẫn sẽ có các chức năng thành viên để truy cập nó.Có cách nào để có tương đương với cấu trúc trong Java 1.4 không?

Tôi 98% chắc chắn câu trả lời là không có nhưng suối hy vọng vĩnh cửu ...

gì/tại sao: Trong mã của chúng tôi, chúng tôi có 100.000 đối tượng (khoảng 12-14% tổng số bộ nhớ) đó là một int và một boolean. Nếu đó là cấu trúc C# bên trong đối tượng, nó sẽ làm giảm số lượng đối tượng. Và ... chúng tôi đang xem xét làm cho nó chỉ là một int trong đó 0x40000000 là giá trị boolean. Nhưng việc xử lý dễ dàng hơn nhiều nếu chúng ta có các phương thức thành viên cho int đó và nó được coi là một cấu trúc.

+0

Bạn có vẻ lo ngại về việc cấp phát bộ nhớ ... Bạn có ý là sử dụng "mới" không? –

+1

Bạn có thể cung cấp một số mã mẫu mô tả chính xác "cấu trúc" Java là gì không? –

+0

Bạn có nghĩa là tương đương với cấu trúc C#? Một loại giá trị, không có tham chiếu, không thể là null, không nhấn vào bộ thu gom rác? –

Trả lời

1

Không, bạn phải sử dụng Object s cho "cấu trúc" chung.

Tuy nhiên đối với cấu trúc dữ liệu đơn giản như cặp int s, bạn có thể sử dụng một chút thủ thuật để tiết kiệm bộ nhớ và tăng tốc độ.

int a = 9; 
int b = 10; 
long pair = (a << 32)|b; 

này gói 32 bit của ab thành một long. Đây là cách bạn giải nén chúng:

a = (int)(pair >> 32); 
b = (int)pair; 
1

Một sự thêm vào tskuzzy's answer: khả năng khác sẽ được nâng int xint y lĩnh vực từ lớp Point vào bất kỳ lớp học mà cần phải lưu trữ các giá trị điểm.

Chỉnh sửa để đáp ứng với nhận xét:

Một điều bạn có thể làm là phải có mỗi lớp mà cần phải lưu trữ một giá trị điểm duy nhất thừa kế một lớp Point. Sẽ không có mối quan hệ hợp lý, nhưng nó cho phép bạn truy cập vào các đối tượng Point thông qua một giao diện duy nhất. Điều này sẽ không làm việc (tôi không nghĩ) cho bất kỳ lớp nào cần lưu trữ nhiều giá trị điểm, mặc dù.

+0

Đó là những gì chúng tôi đang xem xét. Nhưng chúng tôi có một loạt những thứ này trong một lớp học và để tất cả trở nên lộn xộn. Tôi ghét mất sự sạch sẽ của một giao diện đối tượng. Ồ, cuộc sống không hoàn hảo. –

+0

Bạn vẫn có thể viết một đối tượng có giao diện đẹp, nhưng sử dụng bộ nhớ hiệu quả hơn. –

2

Hiện không có cấu trúc tương đương trên Java, mặc dù tôi tin rằng chúng đã được gợi ý cho các phiên bản sau này. Vẫn có một cái nhìn về mô hình cân bằng, có thể là những gì bạn đang tìm kiếm http://en.wikipedia.org/wiki/Flyweight_pattern

+0

Thật không may tất cả những điều này có giá trị khác nhau. Hoặc để chính xác hơn, mỗi giá trị có thể được đặt thành một giá trị khác bất kỳ lúc nào. –

+0

cũng mô hình nói rằng các đối tượng là bất biến nhưng bạn có thể thay đổi tham chiếu đến đối tượng bằng cách lấy một đối tượng mới từ hồ bơi, hầu hết các đối tượng 100k + của bạn có khác nhau không?, bạn có thể tái cấu trúc nó thành các bộ phận có thể phân biệt được không? – ilcavero

+0

Nó có lẽ sẽ là một hồ bơi của một vài trăm. Nhưng điều đó di chuyển vấn đề bởi vì mỗi bộ sau đó sẽ trở thành một bản đồ tra cứu và phân công. Tôi nghĩ rằng sẽ tồi tệ hơn việc lưu trữ các nguyên thủy trực tiếp và có các phương thức tĩnh để hoạt động trên chúng. Đưa tôi trở lại những ngày cũ của C, nơi mà đoạn code tôi viết là, trong tầm nhìn, về hướng đối tượng như bạn có thể nhận được chỉ với cấu trúc. –

Các vấn đề liên quan