java - Java中接口(interface)实现的方法调用分离,也许使用Spring

标签 java spring interface

我有一个这样的界面:

public interface ISmsService {
    //method for vendor A
    String sendSms();

    //method for vendorB
    int sendSms(String loginid);
}

该接口(interface)描述了两个供应商的重载方法。

我有一个像这样的供应商 A 实现:

public class VendorAService implements ISmsService{

    @Override
    public String sendSms() {
        return "send msg via vendor A";
    }

    //I want to restrict the usage of this method for vendor B instance at compile time
    @Override
    public int sendSms(String loginid) {
        //I can throw an exception but I do not want to restrict it at runtime.
        return 0;
    }

}

供应商 B 的实现如下:

public class VendorBService implements ISmsService{

    //I want to restrict the usage of this method for vendor A instance at compile time
    @Override
    public String sendSms() {
        //I can throw an exception but I do not want to restrict it at runtime
        return null;
    }

    @Override
    public int sendSms(String loginid) {
        return 1000;
    }

}

我的实现类是这样的:

public class User {


    public static void main(String[] args) {
        ISmsService smsService = new VendorAService();
        smsService.sendSms("12345"); // I want thiş line gives a compile time error. I want only a vendorB type can call this method.

        smsService = new VendorBService();
        smsService.sendSms(); //Same here. I just want vendorA type can call sendSms method without a String parameter
    }

}

正如我在注释行中所描述的,我想指定供应商实例只能调用特定的方法。我可以在运行时抛出异常,例如错误的供应商调用。但如果可能的话,我想限制编译时的行为。

有人遇到过这样的问题吗?

spring有解决这个问题的方法吗?

提前致谢

最佳答案

如果您不希望用户能够调用错误的方法,并且希望编译器为您进行检查,解决方案非常简单:完全删除接口(interface) ISmsService 。就您而言,它根本没有帮助,引入了附带的复杂性,而不为您提供任何简化作为返回。界面的用户需要不断区分供应商,即使他们得到的界面据称可以消除差异。

如果你想获得接口(interface)的好处,你应该以某种方式统一这两个方法,让用户调用接口(interface)方法而不用考虑背后是哪个供应商。例如,您可以这样做:

class SmsParameters {
    ... // Add methods to set parameters, in some non-restrictive way.
    ... // In particular, users should be able to pass login parameters through it
}

class SmsReturn {
    ... // Add methods to harvest the return value, e.g. as an Object
}

interface ISmsService {
     SmsReturn sendSms(SmsParameters args);
}

编译器在将供应商与调用者匹配方面无能为力,但至少调用者只能调用一种方法。

关于java - Java中接口(interface)实现的方法调用分离,也许使用Spring,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20018722/

相关文章:

java - 需要帮助编译此迭代和接口(interface)程序

C#接口(interface)实现关系只是 "Can-Do"关系?

JavaFX 目录选择器 - 如何从目录获取路径?

java - 处理 POM : [error] non resolvable import POM 时遇到了一些问题

java - 如何在 Java 中清除控制台 - Eclipse SDK

java - org.hibernate.Session 的 Save 方法未将数据保存在数据库中

java - 如何从不同的目录同时正确启动 2 个 Tomcat 服务器?

java - 为什么在尝试使用 constructor-arg 元素初始化 bean 时出现 BeanCreationException

java - 如何使用Spring Boot登录/注销?

go - 将 interface{} 转换为 int go-gin 时出错