2010-10-07 37 views

Trả lời

17

Bạn cần phải thực hiện nó như thế này:

public class Foo { 
    public Foo() { 
    this(makeBar()); 
    } 
    public Foo(Bar b) { 
    // ... 
    } 
    private static Bar makeBar() { 
    Bar b = new Bar(); 
    b.setSomeData(); 
    b.doSomethingElse(); 
    return b; 
    } 
} 

Phương pháp makeBar nên tĩnh, vì các đối tượng tương ứng với this không có sẵn tại thời điểm bạn đang gọi phương pháp này.

Nhân tiện, cách tiếp cận này có lợi thế là nó không chuyển đối tượng Bar được khởi tạo hoàn toàn tới Foo(Bar). (@ RonU lưu ý rằng cách tiếp cận của anh ta không. Điều đó tất nhiên có nghĩa là nhà xây dựng Foo(Bar) của anh ta không thể giả định rằng đối số Foo của nó ở trạng thái cuối cùng của nó. Điều này có thể là vấn đề.)

Cuối cùng, tôi đồng ý rằng phương pháp nhà máy tĩnh là một lựa chọn tốt cho phương pháp này.

+0

Điều này có thực sự trả lời thư trên hàm tạo thứ hai không? – RonU

+3

* trả lời thư * ??? –

+0

@RonU - IMO, câu trả lời của tôi trực tiếp giải quyết câu hỏi của OP. Nếu bạn không đồng ý, vui lòng giải thích lý do. –

5

Bạn có thể thực hiện "constructor mặc định" như một phương thức tĩnh:

public class Foo { 
    public static Foo createFooWithDefaultBar() { 
    Bar b = new Bar(); 
    b.setSomeData(); 
    b.doSomethingElse(); 
    return new Foo(b); 
    } 
    public Foo(Bar b) { 
    // ... 
    } 
} 
-1

Giống như nó nói, một lời kêu gọi này() phải là điều đầu tiên xảy ra trong một constructor. Có lý do nào không hiệu quả không?

public class Foo { 
    public Foo() { 
    this(new Bar()); 
    Bar b = getBar(); 
    b.setSomeData(); 
    b.doSomethingElse(); 
    } 
    public Foo(Bar b) { 
    // ... 
    } 
} 
+0

Nó có thể hoạt động, nhưng nó xấu xí :-) –

+0

Không tranh cãi về điều đó. Đối với tôi, những tình huống này thường biến thành yêu cầu của tôi-tôi-thực sự-muốn-đó-constructor, và thường là câu trả lời là không, như tôi nghĩ rằng điều này có mùi sai. Tôi muốn có pass instantiator trong một Bar được cấu hình đầy đủ (constructor thứ hai) và tiếp tục. – RonU

+2

Điều này sẽ không hoạt động vì 'Foo (Bar b)' có thể thực hiện một số thao tác với 'b', điều này phải xảy ra sau khi khởi tạo' b' – yegor256

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