2012-01-26 28 views
5

Trong đoạn mã sau, thực tế là xấu cho updateWithContex để trả về cùng một đối tượng mà nó lấy làm tham số?Thực hành Java: trả về cùng một đối tượng đã được chuyển thành tham số

class SomeClass{ 
    Foo updateWithContex(Foo foo){ 
     foo.setAppId(i); 
     foo.setXId(index); 
     //..... 
     return foo; 
    } 
} 

class Foo{ 

    public void setAppId(int appId) 
    { 
     // 
    } 
    public void setXId(int appId) 
    { 
     // 
    } 
    public void changeState(X x) 
    { 
     // 
    } 
} 

Trong C++, tôi đã thấy mã như thế này:

BigObject& 
    fastTransform(BigObject& myBO) 
    { 
     // When entering fastTransform(), myBO is the same object as the function 
     // argument provided by the user. -> No copy-constructor is executed. 
     // Transform myBO in some way 
     return myBO; // Transformed myBO is returned to the user. 
    } 

là cũng này sai?

+2

Phương pháp chuỗi có một chút khác biệt, bạn trả về một tham chiếu đến đối tượng mà phương thức đã được gọi, chứ không phải đối tượng được truyền như tham số như trong trường hợp này. – buc

+0

@buc: Đúng, điểm tốt. Tôi đã quá nhanh, sau đó –

Trả lời

9

Trả về một đối tượng sẽ đề xuất cho người dùng abi của bạn rằng đối tượng được truyền trong đối tượng sẽ không bị thay đổi và thay vào đó đối tượng được sửa đổi mới sẽ được trả về. Để làm rõ rằng đây không phải là trường hợp tôi đề nghị thay đổi kiểu trả về thành void.

+0

Điều này có ý nghĩa! Nhưng về cơ bản nó có sai không? hoặc là nó chỉ dễ đọc của Bộ luật? – yadab

+2

Nó phụ thuộc vào cách bạn xác định "về cơ bản sai" ... Liệu nó có làm cho phương pháp không thể sử dụng? Không. Tên của bạn có bị nguyền rủa bởi bất kỳ ai khác phải gọi phương pháp của bạn không? Có lẽ! – vaughandroid

+0

@vaughandroid một cách tốt hơn để xử lý điều này là gì? – user11235813

2

Mã của bạn sẽ trông như thế này:

class SomeClass{ 
    void updateWithContex(Foo foo){ 
     foo.setAppId(i); 
     foo.setXId(index); 
     //..... 
    } 
} 

Đó là thực tế xấu, bởi vì bạn vượt qua tham chiếu đến đối tượng foo, vì vậy bạn có thể thay đổi nó trong phương thức updateWithContex mà không trả lại nó trở lại phương pháp này. Một lần nữa, hãy nhớ rằng bạn luôn làm việc với tham chiếu với Java. Và chắc chắn, không có cách nào để làm điều đó ở nơi khác - nó sẽ luôn luôn là một tham chiếu đến một đối tượng. Java không có gì giống như thế này: fastTransform (BigObject & myBO).

+0

Fwiw, tôi mong rằng updateWithContext là riêng tư, và đến mức này kiểu trả về không phải là siêu quan trọng. Nếu bạn có các phương thức công khai sửa đổi trạng thái bên trong của Foo, tôi sẽ khai báo các thành viên này là void của Foo. –

+0

Tôi biết cách tham chiếu Java hoạt động, đó là lý do tại sao tôi đã cung cấp C++ refs để làm rõ sự cần thiết. Câu hỏi của tôi là: Tại sao nó sai để trả lại cùng một Foo. Khi chúng tôi lập trình với việc lắp ráp các thay đổi đăng ký giống nhau và bị đẩy lùi, tại sao không có trong Java? – yadab

+0

@Savino Sguera - updateWithContext là gói riêng tư. –

2

Tôi không thấy điều gì sai, đó là vấn đề về thiết kế API. Với đoạn code bạn đã gửi, bạn có thể làm điều gì đó như

someClass.updateWithContext(new Foo()).changeState(x); 

thay vì

Foo foo = new Foo(); 
someClass.updateWithContext(foo); 
foo.changeState(x); 

Đoạn mã đầu tiên là một ví dụ tốt của fluent interface hơn một giây.

+0

Cảm ơn! Nhưng trường hợp của tôi là hơi khác so với những gì bạn trả lời cho (phương pháp chuỗi không phải là vấn đề của tôi). – yadab

1

Output Parameters in Java một số đối tượng có thể thay đổi một số không thay đổi. Sự an toàn của các phương pháp như vậy cũng đáng ngờ. Nó có thể được thực hiện nhưng có nó thường được coi là không phải là một điều tốt và google cho paramters java đầu ra quá. Hi vọng điêu nay co ich.

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