How to implement a 'generate getter/setter' for a Java Class in emacs?

后端 未结 4 787
别跟我提以往
别跟我提以往 2021-02-07 10:27

Sometimes I miss the laziness of using an IDE that let me just write the attribute of a Java class and then let the IDE generate the required getter/setter.

Can Emacs do

相关标签:
4条回答
  • 2021-02-07 10:40

    I'm using yasnippet as well, but this is a better snippet, 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
    

    This code, for instance is generated in 10 keystrokes (r, C-o, Long, C-o, id, C-o):

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

    I recommend binding yas/expand to C-o and not TAB to avoid clashes with e.g. auto-complete. I have this setup:

    (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))))
    

    Note (expand-abbrev) somewhere inside this code. It allows me to expand e.g. bis to BufferedInputStream when I define:

    (define-abbrev-table 'java-mode-abbrev-table
      '(
        ("bb" "ByteBuffer" nil 1)
        ("bis" "BufferedInputStream" nil 1)
        %...
    ))
    
    0 讨论(0)
  • 2021-02-07 10:53

    If you use the java-mode YASnippets by nekop you get the snippet prop which lets you define a private variable and it automatically makes a getter and a setter for that variable. The snippet reads as follows:

    # -*- 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;
    }
    

    As can be seen this snippet does not differ much from the other answers except that it may be better formatted. Another advantage is that it is part of a package of snippets for Java.

    0 讨论(0)
  • 2021-02-07 10:56

    This site shows with elisp that can be pasted into your .emacs, how to generate getter and setter methods.

    JDEE has the capability along with a lots more built in to itself.

    0 讨论(0)
  • 2021-02-07 11:01

    You asked specifically about generating a getter/setter pair. And you can write elisp to do this. But it may be interesting to look into a more general solution.

    To solve this generally, I use ya-snippet . The name refers to "Yet Another Snippet package", so you can be sure the problem has been solved before. But I found ya-snippet to be the most useful, simple, and capable solution, for my needs.

    For a property with a getter/setter, I type

    prop<TAB>
    

    ...and I get a template that I can then fill in, like a form. I specify the name of the property, and everything else is generated. Very nice, easy.

    enter image description here

    This works for any micro-pattern you commonly use in code. I have snippets for a singleton, constructor, for loops, switch statements, try/catch, and so on.

    The key with ya-snippet is there is no elisp code to write. Basically I just provide the text for the template, and it works. This is the ya-snippet code for the getter/setter snippet you see above:

    # 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}
    }
    

    Everything above the "# --" is metadata for the snip. The "key" is the most important bit of that metadata - it is the short sequence that can be expanded. The name is shown on the yasnippet menu. The stuff below the # -- line is the expansion code. It includes several fill-in fields.

    YAsnippet works for any programming mode in emacs (java, php, c#, python, etc) and it works for other text modes too.

    0 讨论(0)
提交回复
热议问题