簡體   English   中英

Java 從基地創建 class

[英]Java creating devired class from base

假設我有一個基地 class:

Class A {
    public String field1;

    public A(String field1){
        this.field1 = field1;
    }
}

還有一個 class:

Class B extends A {
    public String field2;
}

假設我有一個List<A> listA ,我如何創建一個構造函數以便我可以輕松地將此列表轉換為List<B> listB 我想在B class中有一個構造函數,它將采用A object並填充BA的所有字段,並具有一些邏輯來構造新字段。 像這樣:

Class B extends A {
    public String field2;

    public B (A a){
        this = a;
        this.field2 = doLogic(a);
    }
}

或者至少只填寫 B 中 A 的所有字段:

public B(A a){
    this = a;
}

所以稍后我可以手動將B中的字段設置為如下所示:

listA.stream().map(x -> new B(x)).map(x -> x.setField2(logic(x)));

我知道我可以這樣做:

Class B extends A {
    public String field2;

    public B(A a){
        super(a.getField1());
    }
}

但這在我看來並不合適,獲取 object 的字段只是為了調用同一個 class 的構造函數。

如果base class 有很多字段怎么辦,是否需要獲取所有字段才能在構造函數中調用? 看起來不太好,所以我想知道是否有更好的方法。

如果base class有很多字段怎么辦

第一個問題當然是您為什么需要它以及是否有其他方法。 在這個答案中,我假設您已經回答了這個問題並得出了您需要它的結論。

假設我有一個List<A> listA ,我如何創建一個構造函數以便我可以輕松地將此列表轉換為List<B> listB

你可以做一個復制構造函數,也可以做這樣的事情:

class A { 
  A(A other) {
    //copy fields
  }
}

class B extends A {
  B(A other) {
    super(other);
    //init B fields
  }
}

有了這個,您可以使用普通迭代或流式處理將List<A>轉換為List<B>

List<B> convertedList = origList.stream().map(a -> new B(a)).collect(Collectors.toList());

另一種選擇可能是委托,但這取決於您的課程:

class B extends A {
  A delegate;      

  B(A delegate) {
    this.delegate = delegate;
    //init B fields
  }

  @Override
  void setField1(String value) {
    delegate.setField1(value);
  }

  @Override
  String getField1() {
    return delegate.getField1();
  }
}

這樣做會使 B 的“field1”為空,因此它可能不是最佳選擇。 如果你有一個 A 的接口,它看起來很相似但留下更少的“空”字段:

interface AInterface {
  void setField1(String value);
  String getField1();
}

class A implements AInterface {
   ...
}

class B implements AInterface {
  AInterface delegate;
  
  B(AInterface delegate) {
     this.delegate = delegate;
    //init B fields
  }

  @Override //this is not an actual override but an implementation
  public void setField1(String value) {
    delegate.setField1(value);
  }

  @Override //this is not an actual override but an implementation
  public String getField1() {
    return delegate.getField1();
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM