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

时间:2011-02-14 08:39:43

标签: java emacs

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

Emacs可以这样做吗?

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

4 个答案:

答案 0 :(得分:12)

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

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

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

prop<TAB>

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

enter image description here

这适用于您在代码中常用的任何微模式。我有一个单例,构造函数,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等)中的任何编程模式,它也适用于其他文本模式。

答案 1 :(得分:8)

我也在使用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次击键生成(rC-oLongC-oidC-o) :

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

我建议将yas / expand绑定到C-o而不是TAB以避免与之发生冲突 例如自动完成。 我有这个设置:

(global-set-key "\C-o" '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)。它允许我扩展,例如我定义时bisBufferedInputStream

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

答案 2 :(得分:3)

带有elisp的

This网站节目可以粘贴到您的.emacs中,如何生成getter和setter方法。

JDEE有能力以及更多内置于自身。

答案 3 :(得分:3)

如果您使用java-mode YASnippets by nekop,则会获得代码段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的一个代码片段的一部分。