gpt4 book ai didi

java - 重构命名 bean 以避免代码重复

转载 作者:行者123 更新时间:2023-12-02 09:54:45 26 4
gpt4 key购买 nike

我发现我正在系统地重复我的命名 bean 中的代码,因此我正在寻找一种重新组织代码的方法。

例如,我有三个命名 bean,它们重复有关项圈的代码:

@Named(value = "dogController")
@ViewScoped
public class DogController implements Serializable {

private Dog dog; // Class Dog has a List<Collar>
private Collar collar = new Collar(); // to be used in an XHTML form
....
public addCollar(){
//adds collar in dog
}
public removeCollar(){
//removes collar from dog
}
}

黄 bean CatControllerBirdController也有相同的代码。 Photo 也会发生同样的情况,全部重复代码。所以我认为我在这里遵循了一种模式。

我立即采取的步骤是创建一个 interface HasCollar对于 Dog , CatBird 。然后我将重复的代码移动到一个新的 bean 中:

@Named(value = "collarController")
@ViewScoped
public class CollarController implements Serializable {

private HasCollar animal;
private Collar collar = new Collar(); // to be used from the XHTML
....
public addCollar(){
//adds collar in animal
}
public removeCollar(){
//removes collar from animal
}
}

到目前为止一切顺利。我现在的问题是:

  • 如何初始化 animal ?特别是因为相同的 XHTML 可能同时使用 Dog和一个 Cat 。之前还好,因为有一个 Collar每个类型的对象。如果我必须注入(inject)它,我不知道如何注入(inject)。 (该问题看起来与 this 类似,但略有不同)。
  • 通常我会扩展 CollarController 中的命名 bean并重用所有功能,但这是不可能的,因为指定的 bean 已经从另一个类继承。

那么,如何重构这种情况以尽可能减少重复代码?

(如果需要更多信息,请告诉我)

最佳答案

考虑DogCollar之间的关系:Dog有一个Collar

换句话说,addCollar()removeCollar()Dog 的操作,因此这些方法属于 Dog 内部:

 public class Dog {
public addCollar(){
//adds collar
}
public removeCollar(){
//removes collar
}
}

对于等也是如此。此时代码仍然是重复的。

然后 Controller 可以简单地委托(delegate):

@Named(value = "dogController")
@ViewScoped
public class DogController implements Serializable {
private Dog dog; // Class Dog has a List<Collar>
private Collar collar = new Collar(); // to be used in an XHTML form

public addCollar(){
//adds collar in dog
dog.addCollar();
}
public removeCollar(){
//removes collar from dog
dog.removeCollar();
}
}

对于CatBird等 Controller 也是如此。

现在公共(public)代码可以放在一个类中,例如:

public class CollarHandler {
private List<Collar> collars;
public addCollar(){
//adds collar
}
public removeCollar(){
// remove a collar;
}
}

Dog 的构造函数采用 CollarHandler,并将其方法委托(delegate)给处理程序:

public class Dog {
private CollarHandler collarHandler;
public Dog(CollarHandler collarHandler) {this.collarHandler = collarHandler; }

public addCollar(){
collarHandler.addCollar();
}
public removeCollar(){
collarHandler.removeCollar();
}
}

对于等也是如此

没有通用接口(interface),也没有继承。每个 Controller 仍然是独立的,但行为可以共享。

关于java - 重构命名 bean 以避免代码重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56082125/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com