【问题标题】:Generic way of introducing a new variable to every method向每个方法引入新变量的通用方法
【发布时间】:2019-07-16 10:02:29
【问题描述】:
public interface Names{
    public List<String> getFirstNames();
    public List<String> getNamesWithPrefix(String prefix);
    public List<String> deleteName(String name);
    ....
    ....
}

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

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

选项1:将 String source 添加到每个方法中,然后在方法中获取源详细信息,据我说这不是干净的代码。

【问题讨论】:

  • 您可以添加一个返回正确源的默认方法 getSource(),并从需要的方法中调用它。您还可以在具体实现中随意覆盖默认方法

标签: java spring spring-boot coding-style


【解决方案1】:

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

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

虽然我不推荐这种方法(具有发送参数的通用方法),因为您的方法的使用(应该只由您的接口公开)将与实现耦合,如果您检查任何公共库,您将看到方法使用不同的参数进行重载,这使得实现的可读性和抽象性更上一层楼

【讨论】:

  • 我知道......但正如您所见,这些方法取决于变量 Source。有什么方法可以建立源代码以便方法只能在该源代码中工作?对于重载,我必须为每个副本创建具有可变源的方法
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    不要更改方法签名,使用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){...};
        ....
        ....
    }
    

    【讨论】:

      猜你喜欢
      • 2012-03-28
      • 1970-01-01
      • 2012-03-07
      • 1970-01-01
      • 1970-01-01
      • 2018-05-28
      • 2017-06-01
      相关资源
      最近更新 更多