Как реализовать "генерировать getter/setter" для Java-класса в emacs?

Иногда мне не хватает лени использовать IDE, которые позволяют мне просто написать атрибут класса Java, а затем позволить IDE генерировать требуемый getter/setter.

Может ли Emacs сделать это?

В настоящее время я просто скопирую пасту пары getter/setter из предыдущей строки, а затем скопирую пасту и изменяю ее. Это просто, но все же сделать кодирование немного смешнее:)

Ответы

Ответ 1

Вы спросили конкретно о создании пары геттер/сеттер. И вы можете написать elisp, чтобы сделать это. Но может быть интересно рассмотреть более общее решение.

Чтобы решить эту проблему, я использую ya-snippet. Это название относится к "еще одному пакетному фрагменту", поэтому вы можете быть уверены, что проблема была решена раньше. Но я нашел, что ya-snippet является самым полезным, простым и способным решением для моих нужд.

Для свойства с геттером/установщиком я печатаю

prop<TAB>

... и я получаю шаблон, который я могу заполнить, как форму. Я указываю имя свойства, и генерируется все остальное. Очень приятно, легко.

enter image description here

Это работает для любого микро-шаблона, который вы обычно используете в коде. У меня есть фрагменты для singleton, constructor, для циклов, операторов switch, try/catch и т.д.

Ключ с ya-snippet заключается в отсутствии кода elisp для записи. В основном я просто предоставляю текст для шаблона, и он работает. Это код ya-snippet для фрагмента getter/setter, который вы видите выше:

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

Все выше "# -" - это метаданные для snip. "Ключ" - это самый важный бит этих метаданных - это краткая последовательность, которая может быть расширена. Имя отображается в меню yasnippet. Материал ниже строки # -- - это код расширения. Он включает несколько полей заполнения.

YAsnippet работает для любого режима программирования в emacs (java, php, С#, python и т.д.), и он также работает и для других текстовых режимов.

Ответ 2

Я использую 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 нажатий клавиш (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; }

Я рекомендую привязать 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) где-то внутри этого кода. Это позволяет мне расширяться, например, bis до BufferedInputStream, когда я определяю:

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

Ответ 3

Этот сайт показывает с elisp, который можно вставить в ваш .emacs, как создать методы getter и setter.

JDEE имеет возможность наряду с большим количеством встроенных в себя.

Ответ 4

Если вы используете java-mode YASnippets by nekop, вы получаете фрагмент prop, который позволяет вам определить приватную переменную и автоматически создает геттер и сеттер для этой переменной. Этот фрагмент выглядит следующим образом:

# -*- 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.