2011-07-07 39 views
6

Nếu phương thức populates/sửa đổi một đối tượng, nó sẽ thích hợp hơn để trả về đối tượng hoặc giữ kiểu trả về là void và phương thức sẽ sửa đổi đối tượng thông qua tham chiếu của nó ?Java trả về đối tượng/sửa đổi đối tượng (hướng dẫn mã hóa)

public Obj populate(Obj o) 
{ 
.... 
return o; 
} 

public void populate(Obj o) 
{ 
.... 
} 

Tôi biết đây là một câu hỏi nhỏ, nhưng câu hỏi nào được ưa thích nhất?

+0

Với câu trả lời của tôi '' 'return o' '' phụ thuộc vào việc bạn thực hiện nó. Đối tượng truyền qua ref sẽ sửa đổi đối tượng trong ngăn xếp. Với tôi '' 'return o' '' câu lệnh là không cần thiết. – glg

+0

http://stackoverflow.com/questions/40480/is-java-pass-by-reference –

Trả lời

2

Tôi phụ thuộc vào phong cách của bạn, nhưng một lợi thế của việc trả lại: bạn có thể gọi populate(o).doSomethingElse();, tức là bạn có thể thực hiện các cuộc gọi phương thức.

Hãy nhìn vào cách StringBuilder nào đó ví dụ, cho phép điều như thế này new StringBuilder().append("a").append("b")....

+2

StringBuilder không trả về đối số của nó. Nó tự trả về. –

+1

Lưu ý: đó là đối số cho OP đang trả về, không phải là loại khai báo phương thức. –

1

tôi sẽ nói tùy chọn "đầu tiên", để trả lại đối tượng. Điều này không có bất lợi, và để lại cho bạn "phòng" để thực hiện một thay đổi thực hiện trong tương lai (ví dụ, trả về một "bản sao sâu" thay vì cùng một đối tượng) mà không sửa đổi chữ ký.

Tóm lại, tôi thấy nó linh hoạt hơn.

0

Tôi sẽ chọn mục đầu tiên, vì nó cho phép bạn chọn sửa đổi đối tượng bạn truyền và trả lại hoặc lấy một bản sao của đối tượng và trả lại bản sao.

public Obj populate(Obj o) 
{ 
    Obj returnObj = o.clone(); 
    .... 
    return returnObj; 
} 

Điều này cho phép bạn giữ tham chiếu đến đối tượng ban đầu và tham chiếu đến đối tượng đã sửa đổi.

0

Tốt nhất là sửa đổi đối tượng this và không thay đổi đối số.

class ModifiedType { 
    public ModifiedType populate(UnmodifiedType arg) { 
     return this; 
    } 
    // or 
    public void populate(UnmodifiedType arg) { 

    } 
} 

Xem chuỗiBuilder làm ví dụ.

0

Điều thứ hai ít gây nhầm lẫn với tôi, bởi vì nó không rõ ràng từ cái đầu tiên nếu các đối tượng được trả về và truyền đều giống nhau, và tôi không thấy bình thường khi bỏ qua một giá trị trả về.

2

Tôi thường sử dụng số điện thoại Command-Query separation.

Tức là, nếu phương pháp này làm thay đổi đối số, thì cũng không nên trả về đối số.

Tuy nhiên, (như đã nêu trong bài viết wikipedia ở trên) các trường hợp vi phạm nguyên tắc chung này là phù hợp.

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