gpt4 book ai didi

java - 干燥这些类的最佳方法是什么,除了构造函数之外的所有内容都重复

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

所以我进行了一些重构,现在我的两个类除了构造函数之外看起来完全相同。

这些类包装了一个不太漂亮的 API 对象,并添加了一些属于 API 边缘的功能。

class A extends API {
public A {
this.APIOption = Option1;
this.AnotherAPIOption = Option2;
// a few more
}

public ArrayList<String> somethingTheAPIDoesntDo() {
// Do something the API doesn't provide but I use alot
}
// Other shared methods
}

class B extends API {
public B {
this.APIOption = Option3;
this.AnotherAPIOption = Option4;
// a few more
}

public ArrayList<String> somethingTheAPIDoesntDo() {
// Do something the API doesn't provide but I use alot
}
// Other shared methods
}

将两者之间的公共(public)代码推送到抽象基类,并且让子类仅使用专门的选项设置实现其构造函数是否有意义?这在纸面上是有道理的,但有些感觉很奇怪/违反直觉。我在这里错过了一个模式吗?

可能的干燥器解决方案

class A extends BetterAPIBase {
public A {
this.APIOption = Option1;
this.AnotherAPIOption = Option2;
// a few more
}
}

class B extends BetterAPIBase {
public B {
this.APIOption = Option3;
this.AnotherAPIOption = Option4;
// a few more
}
}

abstract class BetterAPIBase extends API {
public Better APIBase() {}
public ArrayList<String> somethingTheAPIDoesntDo() {
// Do something the API doesn't provide but I use alot
}
// Other methods
}

编辑

静态工厂模式很好,但我想我也可以添加一个包含我添加的常用方法的接口(interface)。

我会让 BetterAPI 类也实现 IBetterAPI,这只会公开我在将实例类型声明为 IBetterAPI 时添加的方法.

interface IBetterAPI{
public ArrayList<String> somethingTheAPIDoesntDo();
// other methods I added in BetterAPI
}

//somewhere else:
IBetterAPI niceApi = BetterAPI.createWithOptionSetA();
niceApi.somethingTheAPIDoesntDo();

// Can't do this, nice and hidden.
niceApi.somethingBaseAPIDoes(string uglyOptions, bool adNauseum);

最佳答案

拥有一个带有参数化(可能是私有(private))构造函数和多个静态工厂方法的类不是更简单吗?

class BetterAPI extends API {
private BetterAPI(APIOption option, AnotherAPIOption anotherOption) {
this.APIOption = option;
this.AnotherAPIOption = anotherOption;
}

public static BetterAPI createWithOptionSetA() {
return new BetterAPI(Option1, Option2);
}

public static BetterAPI createWithOptionSetB() {
return new BetterAPI(Option3, Option4);
}

// ...
}

问题的核心似乎是在同一个类中不能有多个无参数构造函数。静态工厂方法为此提供了一个很好的解决方案。

关于java - 干燥这些类的最佳方法是什么,除了构造函数之外的所有内容都重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3214276/

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