Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/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
Java 有哪些方法可以避免/处理长方法签名?_Java_Oop - Fatal编程技术网

Java 有哪些方法可以避免/处理长方法签名?

Java 有哪些方法可以避免/处理长方法签名?,java,oop,Java,Oop,我觉得这个方法签名太长了。有没有更明智或优雅的方式来重新书写 private Email createMail(long actualFileSize, String from, String recipient, String title, String emailContent, MultipartFile attachment, File file) { Email mail = null; if (actualFileSize <= Lo

我觉得这个方法签名太长了。有没有更明智或优雅的方式来重新书写

  private Email createMail(long actualFileSize, String from, String recipient, String title,
      String emailContent, MultipartFile attachment,
      File file) {
    Email mail = null;
    if (actualFileSize <= Long.parseLong(emailFileSizeLimit)) {
     mail = new Email(from, recipient, title,emailContent, null, file);
    } else mail = new Email(from, recipient, title,emailContent, null, null);
    return mail;
  }
private Email createMail(长实际文件大小、字符串发件人、字符串收件人、字符串标题、,
字符串emailContent,多部分文件附件,
(文件){
电子邮件=null;

如果(actualFileSize这似乎非常适合,您需要以精细的方式构造新对象:

public class EmailBuilder {
  private Email mail;
  private String from;
  private String recipient;
  // other properties

  public EmailBuilder withFrom(String from) {
    this.from = from;
    return this;
  }
  public EmailBuilder withRecipient(String recipient) {
    this.recipient = recipient;
    return this;
  }
  public Email send() {
    mail = new Email(from, recipient, title,emailContent, null, file);
    return mail;
  }
}
用法

博士

4) 工厂

让工厂包含所有方法,让它决定调用什么方法。它可以是静态的,也可以是托管的

factory.createBasicMail(name);
factory.createFileMail(name, file);

ps:为了您的心理健康,请使用Lombok

您可以拥有一个自定义类,其属性与签名的参数相匹配,并将其用作
sendMail
方法的参数。特别是当您将该类用作生成器时,使用起来非常方便。@Mena唯一有意义的更改是您使某人可以不设置其中一个pr属性,即使其中每一个都是必需的。您从未实际使用传入的附件。@Servy不一定。如果您可以控制
sendMail
实现并在自定义类中实现一些验证,您就可以了。@Servy这并不完全正确。该方法的所有可为空的参数都是由他们自己的定义是“可选的”,即有一个值,以及编译时的“验证”(即参数是否存在):如果您按照编写方法签名的方式正确地构建包装器,那么所有参数都将在那里。最后,OP问题中的方法体和我实际上没有发布的代码都不包含任何形式的运行时验证,因此从抽象的角度看,这几乎是相同的风险!这就是为什么我坚持认为您做出假设。很好,但是
send()
可能应该重命名为
create()
,因为没有发送电子邮件。
if (actualFileSize <= Long.parseLong(emailFileSizeLimit)) {
    file = null;
}

return new Email(from, recipient, title,emailContent, null, file);
if (actualFileSize <= Long.parseLong(emailFileSizeLimit)) {
    file = null;
}

createMail(from, recipient, title,emailContent, null, file);

******

private Email createMail(long actualFileSize, String from, String recipient, String 
    title, String emailContent, MultipartFile attachment, File file) {
   return new Email(from, recipient, title,emailContent, null, file);
}
Mail mail = mailBuilder.addName(name).add(stuff).compile(); // will call constructor inside
factory.createBasicMail(name);
factory.createFileMail(name, file);