如何覆盖java变量并将变量设置为必填字段
我创建了一个名为email-util.jar的实用程序jar文件。该实用程序的主要目的是通过Amazon SES或Gmail SMTP发送电子邮件。我使用工厂模式来决定电子邮件的类型。 (电子邮件util.jar将在多个项目中使用)如何覆盖java变量并将变量设置为必填字段
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的对象并成功发送电子邮件。
现在我已经在其相应的实现中对亚马逊SES和Gmail的所有配置进行了硬编码。亚马逊和Gmail的配置信息有点不同。
的Gmail
- SMPT主机
- SMTP端口 ...
亚马逊SES
- awsAccessKey
- awsSecretKey
- 区域
- connectionTimeout
- MAXCONNECTIONS
- 了socketTimeout
- maxErrorRetry ...。
但我不希望配置信息被硬编码。我为sendEmail方法引入了一个附加参数。
public Status sendEmail(Email emailVO, EmailConfig config)
EmailConfig是一个简单的bean,我有整个亚马逊和gmail相关的变量。一切工作正常。但我有一些顾虑
Quesions
- 有没有我们可以分开亚马逊SES配置和Gmail的相关配置的一种方式。
- 还有一个问题是用户不知道哪些变量是必需的,哪些变量是可选的。即如果用户选择gmail,则Region是可选的。如何解决这个问题
- 这解决了这个问题
我试图创建一个名为EmailConfig一个标记接口,并创建了执行EmailConfig两个班的任何设计模式。
AmazonSESConfig implements EmailConfig
amazonSES related variables.
GmailConfig implements EmailConfig
gmail related variables.
但它没有奏效。由于它是标记界面,因此无法将Email中的AmazonSES/Gmail的对象存储在EmailConfig中。
隐藏关于用户的特定EmailService
实现的知识,包含实现类中的所有配置并通过工厂给用户具体实现。
class EmailServiceFactory {
public EmailService getService() {}
}
和你没有改变这个方法的签名
interface EmailService {
public Status sendEmail(Email email);
}
有没有我们可以分开亚马逊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,则区域 是可选的。如果你使用Gmail的用户不同的配置类,另一个用于亚马逊如何解决这个问题
,您可以方便地查看所有必填字段都在运行时所重视。
每个实现都可以执行自己的检查。
如果您想在编译时发现问题,可以使用步骤生成器来强制客户端填写所有必填字段。
你可以有一些为:
AmazonSESConfig amazonConfig =
AmazonSESConfig.Builder().awsAccessKey(access).awsSecretKey(secret).region(region)...build();
其中awsAccessKey()
会返回一个包含awsSecretKey()
方法的接口的实例。 awsSecretKey()
方法将返回包含region()
方法的接口实例。对于...
如果强制字段未被赋值,则客户端无法调用构建方法,因为只有最后一个字段才会返回提供了方法build()
方法的接口实例。
从阅读'override'和'core'标签的描述,我不认为这些标签在这里是适当的。 – CollinD
如果用户不知道正在使用哪个服务,并且该服务不控制正在创建的“Email”实例,则所需字段是所有必填字段的联合。没有别的可能的工作。 –