2012-06-19 19 views
6

Xét rằng mã java đơn giản mà sẽ không làm việc:tạo một đối tượng trước khi cuộc gọi siêu trong java

public class Bar extends AbstractBar{ 

    private final Foo foo = new Foo(bar); 

    public Bar(){ 
     super(foo); 
    } 
} 

tôi cần phải tạo ra một đối tượng trước khi super() gọi vì tôi cần phải đẩy nó trong lớp mẹ.

Tôi không muốn sử dụng một khối khởi tạo và tôi không muốn làm điều gì đó như:

super(new Foo(bar)) trong constructor của tôi ..

Làm thế nào tôi có thể gửi dữ liệu đến một lớp mẹ trước siêu cuộc gọi?

+1

Bạn đang cố gắng làm gì? Vấn đề lớn hơn là gì? – ametren

+7

Tại sao bạn không muốn 'super (new Foo (bar))' trong constructor? Và 'bar' đó trong hàm tạo' Foo' là gì? – tibtof

+0

Tôi không muốn làm điều đó theo cách đó, bởi vì tôi có rất nhiều lĩnh vực để vượt qua trong constructor .. –

Trả lời

15

Nếu Foo phải được lưu trữ trong một lĩnh vực, bạn có thể làm điều này:

public class Bar extends AbstractBar{  
    private final Foo foo; 

    private Bar(Foo foo) { 
     super(foo); 
     this.foo = foo; 
    } 

    public Bar(){ 
     this(new Foo(bar)); 
    } 
} 

Nếu không super(new Foo(bar)) vẻ khá hợp pháp đối với tôi, bạn có thể quấn new Foo(bar) vào phương thức static nếu bạn muốn.

Cũng lưu ý rằng các trình khởi tạo trường (như trong ví dụ của bạn) và các khối khởi tạo sẽ không giúp ích gì, vì chúng chạy sau hàm tạo của lớp bậc trên. Nếu trường được khai báo là final ví dụ của bạn sẽ không biên dịch, nếu không bạn sẽ nhận được null trong hàm tạo siêu lớp.

1

điều đó không thể thực hiện được trong java. giải pháp duy nhất có thể là cuộc gọi mới trong siêu khởi tạo.

nếu đối tượng foo có thể được chia sẻ giữa các trường bạn có thể declar nó như tĩnh

public class Bar extends AbstractBar{ 

    private static final Foo foo = new Foo(bar); 

    public Bar(){ 
     super(foo); 
    } 
} 

nếu lớp siêu là dưới sự kiểm soát của bạn, bạn có thể cấu trúc lại nó và sử dụng các mô hình phương pháp mẫu để kéo đối tượng vào constructor thay vì pusing nó từ subclass. này ứng dựng các nguyên tắc Hollywod: không gọi cho chúng tôi, chúng tôi sẽ gọi cho bạn;)

public abstract class AbstractBar{ 

    private Object thing; 

    public AbstractBar(){ 
     this.thing = this.createThatThing();    
    } 

    protected abstract Object createThatThing(); 
} 

public class Bar extends AbstractBar { 

    // no constructor needed 

    protected Object createThatThing(){ 
      return new Thing(); 
    } 
} 
1
class AbstractBar{ 
    public AbstractBar() { 
    } 
    public AbstractBar(Foo t) { 
    } 
} 
class Bar extends AbstractBar{ 
    static Foo t=null; 
    public Bar() { 
     super(t=new Foo()); 
    } 
} 
class Foo{...} 
Các vấn đề liên quan