我想知道是否有类似于对象实例的函数创建的东西,也许有类似的东西?
这段代码是写的,例如,它也不工作
SimpleMailMessage mail = new SimpleMailMessage({
setTo(email),
setFrom(from),
setText(text)
});
剧透:答案是“是的,有点”,但在我们到达之前需要一些解释。
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);
}
}
}
这需要维护大量的代码,而且还没有完成:您还需要一个
toString
和equals
方法,可能还需要一些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