Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何重写java变量并使变量成为必填字段_Java_Variables_Inheritance_Design Patterns_Overriding - Fatal编程技术网

如何重写java变量并使变量成为必填字段

如何重写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的对象并成功发送电子邮件 现在

我创建了一个名为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方法中引入了一个附加参数

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();