如何在emacs中为Java类实现’generate getter / setter’?

有时我会想念使用IDE的懒惰,让我只需编写Java类的属性,然后让IDE生成所需的getter / setter。

Emacs可以这样做吗?

目前我只是复制粘贴前一行的一对getter / setter,然后复制粘贴并修改它。 这很简单,但是,编码有点有趣:)

您特别询问了如何生成getter / setter对。 你可以写elisp来做这件事。 但是,研究更通用的解决方案可能会很有趣。

为了解决这个问题,我使用了ya-snippet 。 该名称是指“又一个Snippet包”,因此您可以确定问题已经解决过。 但是根据我的需要,我发现ya-snippet是最有用,最简单,最有效的解决方案。

对于带有getter / setter的属性,我输入

 prop 

…然后我得到一个模板,我可以填写,就像一个表格。 我指定属性的名称,并生成其他所有内容。 很好,很容易。

在此处输入图像描述

这适用于您在代码中常用的任何微图案。 我有一个单例,构造函数,for循环,switch语句,try / catch等的代码片段。

ya-snippet的关键是没有要编写的elisp代码。 基本上我只是提供模板的文本,它的工作原理。 这是您在上面看到的getter / setter片段的ya-snippet代码:

 # name : getter/setter property ... { ... } # key: prop # -- private ${1:Type} _${2:Name}; public ${1:Type} get$2 { ${3://get impl} } public void set$2($1 value) { ${4://set impl} } 

“# – ”之上的所有内容都是剪辑的元数据。 “密钥”是该元数据中最重要的部分 – 它是可以扩展的短序列。 该名称显示在yasnippet菜单上。 # --行下面的东西是扩展代码。 它包括几个填写字段。

YAsnippet适用于emacs(java,php,c#,python等)中的任何编程模式,它也适用于其他文本模式。

我也在使用yasnippet,但这是一个更好的片段,imho:

 # -*- mode: snippet -*- # name: property # key: r # -- private ${1:T} ${2:value}; public $1 get${2:$(capitalize text)}() { return $2; } public void set${2:$(capitalize text)}($1 $2) { this.$2 = $2; } $0 

例如,此代码在10次击键中生成( rCoLongCoidCo ):

 private Long id; public Long getId() { return id; } public void setId(Long id) { this.id = id; } 

我建议将yas / expand绑定到Co而不是TAB,以避免与自动完成冲突。 我有这个设置:

 (global-set-key "\Co" 'open-line-or-yas) (defun open-line-or-yas () (interactive) (cond ((and (looking-back " ") (looking-at "[\s\n}]+")) (insert "\n\n") (indent-according-to-mode) (previous-line) (indent-according-to-mode)) ((expand-abbrev)) (t (setq *yas-invokation-point* (point)) (yas/next-field-or-maybe-expand-1)))) (defun yas/next-field-or-maybe-expand-1 () (interactive) (let ((yas/fallback-behavior 'return-nil)) (unless (yas/expand) (yas/next-field)))) 

注意(expand-abbrev)在这段代码中的某处。 它允许我在定义时将例如bis扩展为BufferedInputStream

 (define-abbrev-table 'java-mode-abbrev-table '( ("bb" "ByteBuffer" nil 1) ("bis" "BufferedInputStream" nil 1) %... )) 

此站点显示可以粘贴到.emacs elisp,如何生成getter和setter方法。

JDEE具有自己的function以及更多内置function。

如果您使用nekop的java模式YASnippets,您将获得片段prop ,它允许您定义一个私有变量,它会自动为该变量创建一个getter和一个setter。 该片段内容如下:

 # -*- mode: snippet -*- # name: property # key: prop # -- private ${1:String} ${2:name};$0 public $1 get${2:$(upcase-initials text)}() { return $2; } public void set${2:$(upcase-initials text)}($1 $2) { this.$2 = $2; } 

可以看出,这个片段与其他答案没有太大差别,只是它可以更好地格式化。 另一个优点是它是Java的一个片段包的一部分。