2013-08-14 30 views
11

Có cách nào để hoán đổi bản thân mình (điều này) với một số đối tượng khác trong Java không?Java tương đương Smalltalk trở thành:

Trong Smalltalk chúng ta có thể viết

Object subclass:myClass [ 
    "in my method I swap myself with someone else" 
    swapWith:anObject [ 
     self become:anObject. 
     ^nil 
    ] 
] 

myClass subclass:subClass [ 
] 

obj := myClass new. 
obj swapWith:subClass new. 
obj inspect. 

Kết quả là An instance of subClass, rõ ràng.

tôi cần phải làm như sau trong Java:

  • Tôi đang ở một hệ thống phân cấp một chiều (đạo diễn acyclic graph)
  • tại một trong những phương pháp của tôi (sự kiện Phương pháp nghe để được chính xác) Tôi quyết định rằng Tôi không phải là đối tượng phù hợp nhất để ở đây, vì vậy:
  • Tôi tạo một đối tượng mới (từ phân lớp của lớp của tôi chính xác), trao đổi bản thân với anh ta và để bản thân bị thu gom rác trong tương lai gần

Vì vậy, trong ngắn hạn, làm thế nào tôi có thể đạt được trong Java self become: (someClass new:someParameters)? Có một số mẫu thiết kế đã biết tôi có thể sử dụng không?

+3

Tôi muốn thêm mức độ gián tiếp. Một đối tượng container có thể hoán đổi các đối tượng thực hiện giao diện mong muốn. – kiheru

+2

Không giống như trong Smalltalk. Việc sử dụng vùng chứa đơn giản sẽ dễ dàng nhất, ví dụ: trình bao bọc đại diện cho đối tượng "thực" hoặc đặt logic thay thế vào chính lớp DAG. –

Trả lời

4

Ở dạng tổng quát nhất, tùy ý hoán đổi đối tượng không thể điều chỉnh bằng cách nhập tĩnh. Hai đối tượng có thể có các giao diện khác nhau, do đó, điều này có thể thỏa hiệp an toàn loại. Nếu bạn áp đặt các ràng buộc về cách các đối tượng có thể được hoán đổi, một tính năng như vậy có thể được tạo thành an toàn. Tính năng này không bao giờ trở thành chủ đạo, nhưng đã được nghiên cứu trong nghiên cứu. Thay vào đó, hãy tìm kiếm tại Gilgul.

Liên quan chặt chẽ là phân loại lại, khả năng thay đổi lớp của đối tượng một cách linh hoạt. Điều này có thể trong Smalltalk với một số nguyên thủy. Một lần nữa, điều này đặt loại an toàn vào rủi ro, không bao giờ trở thành chủ đạo, nhưng đã được nghiên cứu trong nghiên cứu. Hãy xem Wide Classes, Fickle hoặc Plaid.

Giải pháp của người nghèo đối tượng hoán đổi là proxy mà bạn xen giữa khách hàng và đối tượng để hoán đổi hoặc sử dụng các mẫu thiết kế của nhà nước và chiến lược.

-1

this là từ dành riêng trong Java và bạn không thể ghi đè từ đó.

Điều bạn đang cố gắng thực hiện có thể được triển khai với tham chiếu đơn giản. Bạn chỉ cần lặp lại (hoặc đi qua biểu đồ của bạn) và thay đổi con trỏ đến những gì bạn muốn hoạt động.

Hãy xem xét điều này:

List<String> stringList = new ArrayList<String>(); 
// fill your list 

String longestWord = ""; 
for (String s : stringList) { 
    if (longestWord.length() < s.length()) { 
     longestWord = s; 
    } 
} 

longestWord được poiniting đối tượng khác bây giờ.

+1

Hàm trở thành không thay đổi con trỏ, nó thay đổi chính đối tượng. Bạn không mất đối tượng cũ bằng cách gọi trở thành. Vì vậy, bạn lấy một số dữ liệu đầu tiên, sau đó bạn thay đổi danh tính của nó mà không có bất kỳ mất dữ liệu ... ở đây bạn chỉ ... viết lại. – Michal

+0

Nó phải là 'tham chiếu' thay vì' con trỏ'. Java không có con trỏ. – resueman

+0

Đây là Java và nó hoạt động theo cách này. Ngoài ra tác giả nói: 'Tôi tạo ra một đối tượng mới (từ một lớp con của lớp của tôi là chính xác), trao đổi bản thân với anh ta, và để bản thân mình được thu gom rác trong tương lai gần' – Tala

3

Here là một chuỗi thú vị trên diễn đàn chính thức. Tôi tin rằng encapuslation đối tượng kết hợp với các loại mạnh làm cho chức năng này không thể làm việc trong Java. Cộng với JVM đã chậm, điều này có thể dẫn đến thảm họa ...

+4

"JVM đã chậm"? Chậm so với cái gì? –

+1

Cảm ơn, chuỗi khá thú vị. Mẫu proxy dễ dàng (như trong Smalltalk do quá tải #doesNotUnderstand) sẽ tốt cho trường hợp này thay vì trở thành :. – user2622016

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