如何重写java变量并使变量成为必填字段
我创建了一个名为email-util.jar的实用jar文件。该实用程序的主要用途是通过AmazonSES或Gmail SMTP发送电子邮件。我已经使用工厂模式来决定电子邮件类型。email-util.jar将用于多个项目 EmailService.java接口 amazonses的实现 Gmail的实现 EmailVO将具有ToAddress,FromAddress…。。所有与电子邮件相关的信息都驻留在EmailVO中。 使用工厂模式,我能够创建AWS或Gmail的对象并成功发送电子邮件 现在,我已经在AmazonSES和Gmail的相应实现中硬编码了所有配置。亚马逊和Gmail的配置信息没有什么不同 Gmail Smpt主机 Smtp端口 … 亚马逊SES awsAccessKey awsSecretKey 区域 连接超时 maxConnections socketTimeout maxErrorRetry…。 但我不希望配置信息被硬编码。我在sendEmail方法中引入了一个附加参数如何重写java变量并使变量成为必填字段,java,variables,inheritance,design-patterns,overriding,Java,Variables,Inheritance,Design Patterns,Overriding,我创建了一个名为email-util.jar的实用jar文件。该实用程序的主要用途是通过AmazonSES或Gmail SMTP发送电子邮件。我已经使用工厂模式来决定电子邮件类型。email-util.jar将用于多个项目 EmailService.java接口 amazonses的实现 Gmail的实现 EmailVO将具有ToAddress,FromAddress…。。所有与电子邮件相关的信息都驻留在EmailVO中。 使用工厂模式,我能够创建AWS或Gmail的对象并成功发送电子邮件 现在
public Status sendEmail(Email emailVO, EmailConfig config)
EmailConfig是一个简单的bean,我有整个amazon和gmail相关的变量。一切正常。但我没有什么顾虑
疑问
有没有办法将Amazon SES配置和Gmail相关配置分开。
还有一个问题是,用户不知道哪些变量是必需的,哪些变量是可选的。也就是说,如果用户选择gmail,那么地区是可选的。如何解决这个问题
解决此问题的任何设计模式
我尝试创建一个名为EmailConfig的标记接口,并创建了两个实现EmailConfig的类
AmazonSESConfig implements EmailConfig
amazonSES related variables.
GmailConfig implements EmailConfig
gmail related variables.
但是没有成功。无法在EmailConfig中存储AmazonSES/Gmail对象,因为它是一个标记接口。向用户隐藏有关特定EmailService实现的知识,将所有配置包含在实现类中,并通过工厂为用户提供具体的实现
class EmailServiceFactory {
public EmailService getService() {}
}
您不必更改此方法签名
interface EmailService {
public Status sendEmail(Email email);
}
有没有办法把Amazon和Gmail分开
相关配置
您可以有两个不同的类来返回配置值,但是由于这两个提供程序不依赖于相同的需求,因此您应该显式地使用这些类
而像您尝试的那样拥有一个公共基类是没有意义的:
public Status sendEmail(Email emailVO, EmailConfig config)
您应该为Amazon设置一个类,为Gmail设置另一个类,每个类都有一个不同的方法:
public Status sendEmail(Email emailVO, AmazonSESConfig config)
...
public Status sendEmail(Email emailVO, GmailConfig config)
还有一个问题是,用户不知道哪些变量是必需的,哪些是必需的
哪些变量是可选的。也就是说,如果用户选择gmail,那么该地区
是可选的。如何解决这个问题
如果您为gmail和amazon分别使用一个不同的配置类,那么您可以轻松地检查所有必需字段在运行时是否都有值。
每个实现都可以进行自己的检查
如果希望在编译时发现问题,可以使用步骤生成器强制客户机填充所有必需的字段
你可以有这样的东西:
AmazonSESConfig amazonConfig =
AmazonSESConfig.Builder().awsAccessKey(access).awsSecretKey(secret).region(region)...build();
其中,awsAccessKey将返回包含awsSecretKey方法的接口的实例。awsSecretKey方法将返回包含region方法的接口的实例。所以对于
如果强制字段未赋值,则客户端无法调用生成方法,因为只有最后一个要赋值的字段将返回提供生成方法的接口实例。通过阅读覆盖和核心标记说明,我认为这些标记在这里不合适。如果用户不知道正在使用哪个服务,并且该服务不控制正在创建的电子邮件实例,则必填字段是所有必填字段的并集。没有其他办法可以奏效。
public Status sendEmail(Email emailVO, EmailConfig config)
public Status sendEmail(Email emailVO, AmazonSESConfig config)
...
public Status sendEmail(Email emailVO, GmailConfig config)
AmazonSESConfig amazonConfig =
AmazonSESConfig.Builder().awsAccessKey(access).awsSecretKey(secret).region(region)...build();