当前位置: 首页 > 知识库问答 >
问题:

是否可以在新类上调用set[重复]

乜明朗
2023-03-14

我想知道是否有类似于对象实例的函数创建的东西,也许有类似的东西?

这段代码是写的,例如,它也不工作

    SimpleMailMessage mail = new SimpleMailMessage({
    setTo(email),
    setFrom(from),
    setText(text)
    });

共有1个答案

薄伟彦
2023-03-14

剧透:答案是“是的,有点”,但在我们到达之前需要一些解释。

Java语言不支持这一点。有些语言是这样的,它通常被称为带功能的。例如,javascript的具有语法。

但是,API(如在示例中的SimpleMailMessage类的作者)可以给出他们的类方法,使编写这样的代码成为可能。这通常被称为构建器模式。你的用户会写:

SimpleMailMessage mail = SimpleMailMessage.builder()
  .to(email)
  .from(from)
  .text(text)
  .build();

这不是巫毒魔法或java语言功能-SimpleEmailMessage的作者完成了以下工作:

class SimpleMailMessage {
  String from, to, text;

  SimpleMailMessage(String from, String to, String text) {
    this.from = from;
    this.to = to;
    this.text = text;
  }

  public static SimpleMailMessageBuilder builder() {
    return new SimpleMailMessageBuilder();
  }

  public static class SimpleMailMessageBuilder {
    String from, to, text;

    private SimpleMailMessageBuilder() {}

    public SimpleMailMessageBuilder from(String from) {
      this.from = from;
      return this;
    }

    public SimpleMailMessageBuilder to(String to) {
      this.to = to;
      return this;
    }

    public SimpleMailMessageBuilder text(String text) {
      this.text = text;
      return this;
    }

    public SimpleMailMessage build() {
      return new SimpleMailMessage(from, to, text);
    }
  }
}

这需要维护大量的代码,而且还没有完成:您还需要一个toStringequals方法,可能还需要一些getX()方法,为了方便起见,构建器可能还需要一个toString

通常IDE可以为您生成此代码,但您仍然需要查看它,当您更改字段时,您必须记住将其全部删除并重新运行IDE代码生成工具。

一个更好的选择是lombok的@Builder功能。你可以写:

@Value @Builder
class SimpleMailMessage {
  String from, to, text;
}

你完成了。Lombok负责让所有工具(不仅是javac,还有您的编辑器)认为它拥有所有这些方法。

免责声明:我是Lombok项目的核心维护者。

注:这绝对与功能无关。再说一次,应用于编程的“功能”这个词的含义在这一点上相当模糊,因为人们使用这个词,并用它来表达完全不同的意思。所以,我是谁在这里扔石头:)-只是给你一个提示,当你说“我想在java中使用函数语法来制作简单的对象”时,听到/阅读这句话的人不太可能对你的意思有任何线索那个。

 类似资料:
  • 问题内容: 在JavaScript中使用构造函数创建类时,以后是否可以重新定义类的方法? 例: 现在,我想像这样重新定义: 因此,当我创建另一个时,新方法将被称为: 编辑: 我意识到我可以输入“ Hello”或“Hola”之类的参数来完成不同的输出。我还意识到我可以像这样简单地为p2分配一个新函数: 我只是想知道是否可以重新定义类的方法,以便的新实例将使用新方法。 问题答案: 以后可以重新定义类的

  • 问题内容: 我想使用Redis从命令行,脚本,Web和电子表格中查询数据。除了电子表格,我可以找到所有其他示例的好例子……不过,我不太清楚从何处开始从MS Excel电子表格进行访问。谷歌让我失望。 请让我知道您会如何建议这样做,谢谢! 那些陌生的Redis的ps是此处描述的键值数据存储区:http : //code.google.com/p/redis/ 问题答案: 我想我用XLLoop找到了我

  • 我想重新设置GlobalKTable的键(可能是在初始化它时,因为我相信它们只在创建之后才被读取)。 这可能吗? 我在一个Spring/JavaKafka Streams应用程序中有两个主题。第一个是不压缩的,第二个是。两者都使用Avro作为它们的键和值。 应用程序从第一个(非压缩)主题流式传输记录,并通过从压缩主题附加附加数据。压缩的主题已作为GlobalKTable引入应用程序,通过创建,并且

  • 我有一个bash脚本,我想全局启用set-e。 但是,与其一直禁用它并重新启用它,我想知道是否有一种方法可以有时选择性地禁用错误处理。例如,从systemd运行的命令可以在前面加上一个减号来忽略错误。bash有等效的吗? e. g. 由于需要启用/禁用很多,我不想继续执行以下操作:

  • 假设AWS堆栈是使用CloudFormation创建的。现在,其中一种资源在云层形成之外进行了修改。 1) 有没有可能让CloudFormation专门创建这些资源?根据我的理解,我们不能这样做,因为CloudFormation不能识别差异,因此不能创建修改后的资源。我的观察正确吗? 2) 此外,如果在CloudFormation之外进行了修改,我需要哪些选项才能将堆栈恢复到其原始状态?

  • 问题内容: 我有一个用于编码URI的便捷类。在其中,根据需要的具体程度,我创建了三种方法。我想知道在这种情况下是否使用JavaDoc 重用描述?(我还没有找到) 问题答案: 否。复制适用于覆盖的方法,但不适用于重载的方法。http://java.sun.com/j2se/1.5.0/docs/tooldocs/solaris/javadoc.html#inheritingcomments