2012-06-25 29 views
7

Hãy nói rằng chúng tôi có khối mã sau đây:biến Tuyên bố là của một số loại

if (thing instanceof ObjectType) { 
    ((ObjectType)thing).operation1(); 
    ((ObjectType)thing).operation2(); 
    ((ObjectType)thing).operation3(); 
} 

Tất cả các typecasting làm cho mã trông xấu xí, là có một cách để bày tỏ ý 'điều' như ObjectType bên trong khối đó mã? Tôi biết tôi có thể làm

OjectType differentThing = (ObjectType)thing; 

và làm việc với 'differentThing' từ đó trở đi, nhưng điều đó gây nhầm lẫn cho mã. Có cách nào hay hơn để thực hiện việc này, có thể là một cái gì đó giống như

if (thing instanceof ObjectType) { 
    (ObjectType)thing; //this would declare 'thing' to be an instance of ObjectType 
    thing.operation1(); 
    thing.operation2(); 
    thing.operation3(); 
} 

Tôi khá chắc chắn câu hỏi này đã được hỏi trong quá khứ, tôi không thể tìm thấy nó. Vui lòng chỉ cho tôi bản sao có thể có.

+1

Tôi không nghĩ có cách nào khác ngoài cách bạn đã đề cập. – nhahtdh

Trả lời

9

Không, khi biến được khai báo, loại biến đó được sửa. Tôi tin rằng việc thay đổi kiểu của một biến (có khả năng tạm thời) sẽ mang lại nhầm lẫn xa hơn:

ObjectType differentThing = (ObjectType)thing; 

cách tiếp cận mà bạn tin là khó hiểu. Cách tiếp cận này được sử dụng rộng rãi và thành ngữ - tất nhiên là nó được yêu cầu. (Điều này thường là một chút của một mùi mã.)

lựa chọn khác là để trích xuất một phương pháp:

if (thing instanceof ObjectType) { 
    performOperations((ObjectType) thing); 
} 
... 

private void performOperations(ObjectType thing) { 
    thing.operation1(); 
    thing.operation2(); 
    thing.operation3(); 
} 
4

Khi một biến được khai báo, đó là loại không thể thay đổi. Cách tiếp cận differentThing của bạn là đúng nhất:

if (thing instanceof ObjectType) { 
    OjectType differentThing = (ObjectType)thing; 
    differentThing.operation1(); 
    differentThing.operation2(); 
    differentThing.operation3(); 
} 

tôi sẽ không gọi nó là khó hiểu, một trong hai: miễn là phạm vi của biến differentThing được giới hạn trong cơ thể của người điều khiển if, nó là rõ ràng đối với các độc giả những gì đang xảy ra.

2

Đáng buồn thay, điều này là không thể.

Lý do là "điều" trong phạm vi này sẽ luôn có cùng loại đối tượng và bạn không thể đọc lại nó trong một khối mã.

Nếu bạn không thích có hai tên biến (như điều và castedThing), bạn luôn có thể tạo một hàm khác;

if (thing instanceof ObjectType) { 
    processObjectType((ObjectType)thing); 
} 
.. 

private void processObjectType(ObjectType thing) { 
    thing.operation1(); 
    thing.operation2(); 
    thing.operation3(); 
} 
Các vấn đề liên quan