向每种方法引入新变量的通用方法

时间:2019-07-16 10:02:29

标签: java spring spring-boot coding-style

public interface Names{
    public List<String> getFirstNames();
    public List<String> getNamesWithPrefix(String prefix);
    public List<String> deleteName(String name);
    ....
    ....
}

例如,现在引入了一个名为 String source 的新变量,该变量需要在每种方法中传递。 想象一下变量源告诉我必须从哪个源获取名称。

是否存在定义源的通用方法,以便这些方法可以相应地工作?

选项1:向每个方法添加字符串源,然后在方法内部获取源详细信息,根据我的理解,这不是干净的代码。

3 个答案:

答案 0 :(得分:0)

您可以使用...来拥有无限数量的相同类型的参数,并且在您的实现中,您可以根据传递的参数的索引来控制逻辑

public interface Names{
    public List<String> getFirstNames(Strings ... inputs);
    public List<String> getNamesWithPrefix(String ...inputs);
    public List<String> deleteName(String ...inputs );
    ....
    ....
}

尽管我不推荐这种方法(具有发送参数的通用方法),因为如果您检查任何通用库,您将看到方法的使用(应该仅由您的接口公开)将与实现结合使用。使用不同参数进行重载,这使得实现的可读性和抽象性更高

答案 1 :(得分:0)

这似乎是dependency injection的问题。我能想到的一种解决方案是,在实现类中,有一个参数化的构造函数,您可以在其中传递source,然后可以在接口方法的具体实现中使用该source对象。

现在,由于您只是将source对象传递给构造函数,因此您可以按任何需要的方式对其进行定义,并且代码仍然可以正常工作。简而言之,您的方法将不再取决于定义source对象的方式。

答案 2 :(得分:0)

不要更改方法签名,请使用inheritance为您拥有的每个source实现一个类。在这种情况下,您可以注入与您的源匹配的相应子类。使用您的姓名interface,例如source X和Y会导致:

public class XNames{
    public List<String> getFirstNames(){...};
    public List<String> getNamesWithPrefix(String prefix){...};
    public List<String> deleteName(String name){...};
    ....
    ....
}


public class YNames{
    public List<String> getFirstNames(){...};
    public List<String> getNamesWithPrefix(String prefix){...};
    public List<String> deleteName(String name){...};
    ....
    ....
}