【问题标题】:How do I use interfaces with "fallback" parameters in the methods?如何在方法中使用带有“回退”参数的接口?
【发布时间】:2020-01-05 20:08:42
【问题描述】:
我正在用 java 编写一些代码,并且正在努力确定这是否是好的代码,因为我从未接受过任何真正的教育。我想在我的课程中强制使用 save(ConfigurationSection),但如果不可用,则允许使用 save(String)。我意识到我可以在调用此方法之前进行此转换。这是我应该做的吗?
public interface Serializable {
default void save(String path){
save(Claims.getDataManager().getData().createSection(path));
}
void save(ConfigurationSection section);
}
我想知道是否允许我这样做。还有任何好的资源,对于没有任何行话知识的人来说相对容易理解。
【问题讨论】:
标签:
java
design-patterns
java-8
interface
api-design
【解决方案1】:
我想在我的课程中强制使用save(ConfigurationSection)
很难强制用户使用一种重载方法而不是另一种。如果我有两种选择,我会选择最简单的一种,让 API 为我完成所有繁琐的工作。如果有一个诱人的String 选项,我不会自己构建ConfigurationSection,除非前者为我提供了更灵活/细粒度/高性能的方式。
不过,您可以很好地记录这些方法。明确说明哪种方法更可取,以及为什么。
如果不可用,请允许使用save(String)
我没听懂。有一种方法或两种方法。如果用户无法构建ConfigurationSection,并不意味着save(ConfigurationSection) 神奇地消失了,而save(String) 出现了。你的界面还是这两个方法。
我想知道是否允许我这样做。
是的,你是。你的代码在我看来绝对没问题。
Claims.getDataManager().getData().createSection(path)
可以作为将String 转换为ConfigurationSection 的默认方式,只要它不会带来任何副作用,并且对调用者是透明的。这就像用户已经(或可以)熟悉的快捷方式。
顺便说一句,我喜欢你的问题。它看起来简单而谦逊。
【解决方案2】:
与其提供这种default 方法,不如在ConfigurationSection 类中创建一个fromString 适配器方法
public static ConfigurationSection fromString(String s) {
// ...
}
或者事件更好,以防你有一些额外的逻辑要应用来创建构建器类
public class ConfigurationSectionBuilder {
// dependencies and constructors
private DataManagerData dataManagerData;
public ConfigurationSection fromString(String s) {
return dataManagerData.createSection(s);
}
}
界面应该就这么简单。你想添加什么新方法来创建ConfigurationSection(比如说Long),你需要一些额外的服务依赖吗?这是明显的SRP
也不要像这样创建“链”
Claims.getDataManager().getData().createSection(path)
这是得墨忒耳法则