如何覆盖java变量并将变量作为必填字段

时间:2017-06-22 20:12:50

标签: java variables inheritance design-patterns override

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

EmailService.java(界面)

public Status sendEmail(Email emailVO)

亚马逊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的所有配置。亚马逊和Gmail的配置信息略有不同。

的Gmail

  • 提示主持人
  • Smtp端口 ...

亚马逊SES

  • awsAccessKey
  • awsSecretKey
  • 区域
  • connectionTimeout
  • MAXCONNECTIONS
  • 了socketTimeout
  • maxErrorRetry ....

但我不希望硬编码配置信息。我向sendEmail方法引入了一个额外的参数。

public Status sendEmail(Email emailVO, EmailConfig config)

EmailConfig是一个简单的bean,我有整个亚马逊和gmail相关的变量。一切都很好。但我没有什么顾虑

Quesions

  1. 我们是否可以分离Amazon SES配置和Gmail相关配置。
  2. 还有一个问题是用户不知道哪些变量是强制性的,哪些变量是可选的。即如果用户选择gmail,那么Region是可选的。如何解决这个问题
  3. 解决此问题的任何设计模式
  4. 我尝试创建一个名为EmailConfig的标记接口,并创建了两个实现EmailConfig的类。

    AmazonSESConfig implements EmailConfig
    amazonSES related variables.
    
    GmailConfig implements EmailConfig
    gmail related variables.
    

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

2 个答案:

答案 0 :(得分:1)

  

我们是否可以将Amazon SES配置与Gmail分开   相关配置。

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

在您尝试使用公共基类时没有任何意义:

public Status sendEmail(Email emailVO, EmailConfig config)

你应该有一个亚马逊课程和另一个Gmail课程,每个课程都有一个不同的方法:

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

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

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

如果要在编译时捕获问题,可以使用步骤构建器强制客户端填写所有必填字段。

您可以拥有以下内容:

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

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

如果未对必填字段进行评估,则客户端无法调用构建方法,因为只有最后一个字段值将返回提供build()方法的接口实例。

答案 1 :(得分:0)

从用户隐藏有关特定EmailService实现的知识,包含实现类中的所有配置,并通过工厂为用户提供具体实现。

 class EmailServiceFactory {

      public EmailService getService() {}      

 }

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

interface EmailService {

    public Status sendEmail(Email email); 

}