java - 如何覆盖java变量并使变量成为必填字段

标签 java variables inheritance design-patterns overriding

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

EmailService.java(接口(interface))

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

  • 短信主机
  • SMTP 端口 ...

亚马逊 SES

  • awsAccessKey
  • awsSecretKey
  • 地区
  • 连接超时
  • 最大连接数
  • socketTimeout
  • 最大错误重试...

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

public Status sendEmail(Email emailVO, EmailConfig config)

EmailConfig 是一个简单的 bean,其中包含整个 amazon 和 gmail 相关变量。一切正常。但我没什么担心

问题

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

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

AmazonSESConfig implements EmailConfig
amazonSES related variables.

GmailConfig implements EmailConfig
gmail related variables.

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

最佳答案

Is there a way we can separate Amazon SES configurations and Gmail related configurations.

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

并且像您尝试的那样拥有一个公共(public)基类是没有意义的:

public Status sendEmail(Email emailVO, EmailConfig config)

您应该有一个用于 Amazon 的类和另一个用于 Gmail 的类,每个类都有不同的方法:

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

One more issue is user doesn’t know which variables are mandatory and which variables are optional. I.e. if user opts for gmail then Region is optional. How to solve this problem

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

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

你可以有这样的东西:

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

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

如果未对必填字段赋值,则客户端无法调用构建方法,因为只有最后一个赋值字段才会返回提供 build() 方法的接口(interface)实例。< br/>

关于java - 如何覆盖java变量并使变量成为必填字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44708571/

相关文章:

javascript - 如何增加一个变量,然后保存该变量,然后继续添加?

c# - 将属性添加到类列表

java - Eclipse - 查找 Controller 的 Java 问题

java - Oracle DB - 对特定批处理的未初始化集合的 Java 引用

variables - 如何在不使用$(美元)符号的情况下访问变量

python - 赋值前引用的局部变量 X

python - 如果只调用 super.__init__ 是否需要 __init__?

scala - 迷失在 Scala 集合的继承图中

java - tomcat的性能极限是多少?

java - Android 编译 : No rule to make target