【问题标题】:How to override java variables and make the variables as mandatory fields如何覆盖java变量并使变量成为必填字段
【发布时间】:2017-11-26 06:35:20
【问题描述】:

我创建了一个名为 email-util.jar 的实用程序 jar 文件。该实用程序的主要目的是通过 Amazon SES 或 Gmail SMTP 发送电子邮件。我已经使用工厂模式来决定电子邮件类型。 (email-util.jar 会在多个项目中使用)

EmailService.java(接口)

public Status sendEmail(Email emailVO)

Amazon SES 的实施

public class AmazonSimpleEmailServiceImpl implements EmailService {
public Status sendEmail(Email emailVO)
{
Amazon related stuff
}

Gmail 实施

public class GmailServiceImpl implements EmailService {
public Status sendEmail(Email emailVO)
{
Gmail related stuff
}

EmailVO 将具有 ToAddress、FromAddress..... 所有与电子邮件相关的信息都驻留在 EmailVO 中。 使用工厂模式,我可以创建 AWS 或 Gmail 的对象并成功发送电子邮件。

现在,我已将 Amazon SES 和 Gmail 的所有配置硬编码到相应的实现中。 Amazon 和 Gmail 的配置信息差别不大。

Gmail

  • Smpt 主机
  • SMTP 端口 …

亚马逊 SES

  • awsAccessKey
  • awsSecretKey
  • 地区
  • 连接超时
  • 最大连接数
  • 套接字超时
  • maxErrorRetry ....

但我不希望配置信息被硬编码。我为 sendEmail 方法引入了一个附加参数。

public Status sendEmail(Email emailVO, EmailConfig config)

EmailConfig 是一个简单的 bean,我拥有整个 amazon 和 gmail 相关变量。一切正常。但我没有什么顾虑

问题

  1. 有没有一种方法可以将 Amazon SES 配置和 Gmail 相关配置分开。
  2. 另一个问题是用户不知道哪些变量是必需的,哪些变量是可选的。 IE。如果用户选择 gmail,则 Region 是可选的。如何解决这个问题
  3. 解决此问题的任何设计模式

我尝试创建一个名为 EmailConfig 的标记接口,并创建了两个实现 EmailConfig 的类。

AmazonSESConfig implements EmailConfig
amazonSES related variables.

GmailConfig implements EmailConfig
gmail related variables.

但是没有成功。无法将 AmazonSES/Gmail 的对象存储在 EmailConfig 中,因为它是一个标记接口。

【问题讨论】:

  • 通过阅读overridecore 标签描述,我认为这些标签在这里不合适。
  • 如果用户不知道正在使用哪个服务,并且该服务不控制正在创建的Email的实例,则必填字段是所有必填字段的并集。没有其他方法可以工作。

标签: java variables inheritance design-patterns overriding


【解决方案1】:

有没有一种方法可以将 Amazon SES 配置和 Gmail 分开 相关配置。

您可以有两个不同的类来返回配置值,但由于这两个提供程序不依赖于相同的要求,您应该明确使用这些类。

你尝试使用一个通用的基类是没有意义的:

public Status sendEmail(Email emailVO, EmailConfig config)

您应该为 Amazon 设置一个类,为 Gmail 设置一个类,每个类都有不同的方法:

public Status sendEmail(Email emailVO, AmazonSESConfig config)
     ...
public Status sendEmail(Email emailVO, GmailConfig config)

另一个问题是用户不知道哪些变量是强制性的,并且 哪些变量是可选的。 IE。如果用户选择 gmail 则 Region 是可选的。如何解决这个问题

如果您对 gmail 使用不同的配置类,而对 amazon 使用另一个配置类,则可以轻松检查所有必填字段在运行时是否已被赋值。
每个实现都可以进行自己的检查。

如果您想在编译时发现问题,可以使用步骤生成器来强制客户端填写所有必填字段。

你可以有这样的东西:

AmazonSESConfig amazonConfig = 
AmazonSESConfig.Builder().awsAccessKey(access).awsSecretKey(secret).region(region)...build();

其中awsAccessKey() 将返回一个包含awsSecretKey() 方法的接口实例。 awsSecretKey() 方法将返回一个包含region() 方法的接口实例。所以……

如果强制字段未赋值,客户端将无法调用构建方法,因为只有最后一个要赋值的字段将返回提供build() 方法的接口实例。

【讨论】:

    【解决方案2】:

    向用户隐藏有关特定EmailService 实现的知识,将所有配置封装在实现类中,并通过工厂为用户提供具体实现。

     class EmailServiceFactory {
    
          public EmailService getService() {}      
    
     }
    

    而且您不必更改此方法签名

    interface EmailService {
    
        public Status sendEmail(Email email); 
    
    }
    

    【讨论】:

      猜你喜欢
      • 2015-12-04
      • 2019-02-14
      • 1970-01-01
      • 2015-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多