如何在方法中使用带有 "fallback" 参数的接口?

How do I use interfaces with "fallback" parameters in the methods?

我正在 java 中编写一些代码,并且正在努力决定这是否是好的代码,因为我从未接受过任何真正的教育。我想在我的 类 中强制使用 save(ConfigurationSection),但如果不可用,允许使用 save(String)。我意识到我可以在调用此方法之前进行此转换。那是我应该做的吗?

public interface Serializable {

    default void save(String path){
        save(Claims.getDataManager().getData().createSection(path));
    }
    void save(ConfigurationSection section);

}

我想知道我是否可以这样做。还有任何对行话没有任何真正了解的人相对容易理解的好资源。

与其提供这样的 default 方法,不如在 ConfigurationSection class

中创建一个 fromString 适配器方法更好
public static ConfigurationSection fromString(String s) {
    // ...
}

或者更好的事件,以防你有一些额外的逻辑被应用到创建构建器 class

public class ConfigurationSectionBuilder {
    // dependencies and constructors
    private DataManagerData dataManagerData;

    public ConfigurationSection fromString(String s) {
        return dataManagerData.createSection(s);
    }
}

界面应该就是这么简单。您想要添加创建 ConfigurationSection 的新方法是什么(假设来自 Long),并且为此您需要一些额外的服务依赖性?明显违反SRP


也不要像这样创建'chains'

Claims.getDataManager().getData().createSection(path)

这违反了Demeter 法则

I want to force use save(ConfigurationSection) in my classes

很难强制用户使用一种重载方法而不是另一种方法。如果我有两个选择,我会选择最简单的一个,让 API 为我完成所有脏活。如果有诱人的 String 选项,我不会自己构建 ConfigurationSection 除非前者为我提供更多 flexible/fine-grained/performant 方式。

不过,您可以很好地记录这些方法。清楚地说明哪种方法更可取,以及为什么。

if not available allow for using save(String)

我没听懂。有一种方法或两种方法。如果用户无法构建 ConfigurationSection,并不意味着 save(ConfigurationSection) 神奇地消失了,而 save(String) 出现了。你的接口还是这两个方法

I'd like to know if I am allowed to do this.

是的,你是。你的代码在我看来绝对没问题。

Claims.getDataManager().getData().createSection(path)

可以作为将 String 转换为 ConfigurationSection 的默认方式,只要它不会带来任何副作用,并且对调用者是透明的。它就像是用户已经(或可以)熟悉的快捷方式。

顺便说一句,我喜欢你的问题。看起来朴实无华。