Câu hỏi Làm thế nào để thực hiện một 'tạo ra getter / setter' cho một lớp Java trong emacs?


Đôi khi tôi bỏ lỡ sự lười biếng của việc sử dụng một IDE cho phép tôi chỉ viết thuộc tính của một lớp Java và sau đó để cho IDE tạo ra getter / setter bắt buộc.

Emacs có thể làm được điều này không?

Hiện tại tôi chỉ cần sao chép dán một cặp getter / setter mẫu dòng trước đó, và sau đó sao chép dán và sửa đổi nó. Nó đơn giản, nhưng, làm cho mã hóa một chút funnier :)


14
2018-02-14 08:39


gốc


Nếu hầu hết các getter và setters của bạn có thể được tự động tạo ra bởi một công cụ, sau đó bạn đang thực sự làm OOP một cách sai lầm. Xem mô hình chống mô hình miền không ổn định và tại sao nó xấu: martinfowler.com/bliki/AnemicDomainModel.html - Lie Ryan
Có lý do nào mà bạn phải có một biên tập viên không? Nếu một số thứ dễ làm trong IDE, tôi sẽ chỉ sử dụng IDE cho những thứ đó. - Peter Lawrey
tốt, thực sự nó là yêu cầu Java. Vì vậy, nếu bạn đã nói,int data, để JSTL (java lib dễ dàng truy cập các thuộc tính đối tượng trong ứng dụng web) để có thể truy cập nó, chúng ta phải triển khai setData () và getData (). Yêu cầu nằm trong chính ngôn ngữ đó. :) Vì vậy, tôi nghĩ rằng điều này không có quá trình brainee, nên được để lại đến một công cụ tự động - swdev
Tôi nghĩ bạn có thể dễ dàng sử dụng [yasnippet] [1] cho emacs. [1]: code.google.com/p/yasnippet - phimuemue
@peter: Thật vậy. Tôi chỉ sử dụng câu trả lời được đưa ra bởi vpit3833. simpel, nhưng rất hữu ích :) @ryan: vâng, đó là một điều cần thiết, ví dụ: trong một ứng dụng web java. Đó là một phần của tiêu chuẩn java. :) - swdev


Các câu trả lời:


Bạn hỏi cụ thể về việc tạo ra một cặp getter / setter. Và bạn có thể viết elisp để làm điều này. Nhưng có thể thú vị khi nhìn vào một giải pháp tổng quát hơn.

Để giải quyết vấn đề này, tôi sử dụng ya-đoạn trích . Tên đề cập đến "Gói Snippet khác", vì vậy bạn có thể chắc chắn rằng sự cố đã được giải quyết trước đó. Nhưng tôi đã tìm thấy đoạn mã ya là giải pháp hữu ích, đơn giản và có khả năng nhất, cho nhu cầu của tôi.

Đối với một tài sản với một getter / setter, tôi gõ

prop<TAB>

... và tôi nhận được một mẫu mà tôi có thể điền vào, như một biểu mẫu. Tôi chỉ định tên của thuộc tính và mọi thứ khác được tạo. Rất đẹp, dễ.

enter image description here

Điều này làm việc cho bất kỳ vi mô hình bạn thường sử dụng trong mã. Tôi có đoạn trích cho một singleton, constructor, cho vòng lặp, báo cáo chuyển đổi, try / catch, và như vậy.

Điều quan trọng với đoạn mã ya là không có mã nào để viết. Về cơ bản, tôi chỉ cung cấp văn bản cho mẫu và nó hoạt động. Đây là đoạn mã ya cho đoạn mã getter / setter bạn thấy ở trên:

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

Mọi thứ phía trên "# -" là siêu dữ liệu cho ảnh chụp nhanh. "Khóa" là bit quan trọng nhất của siêu dữ liệu đó - đó là chuỗi ngắn có thể được mở rộng. Tên được hiển thị trên menu menu. Nội dung bên dưới # -- dòng là mã mở rộng. Nó bao gồm một số trường điền.

YAsnippet làm việc cho bất kỳ chế độ lập trình nào trong các emacs (java, php, c #, python, vv) và nó cũng hoạt động với các chế độ văn bản khác.


12
2018-02-14 15:04



bro tuyệt vời! Tôi chưa bao giờ nghĩ rằng một trình soạn thảo văn bản có thể làm điều đó. Tuyệt vời .. cảm ơn nhiều! - swdev
@Cheeso: +1 và đào một chủ đề cũ sáu tuần: bạn đã tạo hoạt ảnh này chưa .gif sử dụng một số gói Emacs? Nếu vậy, cái nào và nếu không, bạn đã tạo ra nó như thế nào? :) - TacticalCoder
@TacticalCoder - không, không phải với gói emacs. Heh. Không phải mọi thứ đều chạy trong emacs, tôi đoán vậy. Tôi đã sử dụng một công cụ gọi là cropper, một tiện ích "chụp màn hình" cũng có khả năng chụp các hình động. Tìm nó trên codeplex.com. - Cheeso


Tôi đang sử dụng yasnippet là tốt, nhưng đây là một đoạn trích tốt hơn, 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

Mã này, ví dụ được tạo ra trong 10 tổ hợp phím (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; }

Tôi khuyên bạn nên ràng buộc yas / mở rộng đến C-o và không TAB để tránh xung đột với ví dụ. tự động hoàn thành. Tôi có thiết lập này:

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

chú thích (expand-abbrev) một nơi nào đó bên trong mã này. Nó cho phép tôi mở rộng ví dụ: bis đến BufferedInputStream khi tôi xác định:

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

8
2017-08-17 15:53



Cảm ơn cho đoạn mã này. Việc chuyển đổi trong đoạn mã không hoạt động với YASnippet hiện tại, nó phải là $(capitalize yas-text) hiện nay. - whatacold
Nếu chúng ta muốn có một getFooBar phương pháp cho biến thành viên của nó fooBar, chúng tôi nên sử dụng tốt hơn (upcase-initials yas-text), thay vì (capitalize yas-text), sẽ giúp chúng tôi getFoobar. - whatacold


Điều này trang web hiển thị với elisp có thể được dán vào .emacs, cách tạo phương thức getter và setter.

JDEE có khả năng cùng với nhiều khả năng được xây dựng trong chính nó.


3
2018-02-14 08:50



wow Cảm ơn. Các defun insert-gettersetter (type field) làm việc cho tôi! Tôi đã đọc về JDEE, và tôi nghĩ tôi sẽ cố gắng sử dụng nó sau này. - swdev


Nếu bạn sử dụng java-mode YASnippets bởi nekop bạn nhận được đoạn trích prop cho phép bạn xác định một biến riêng tư và nó sẽ tự động tạo một getter và một setter cho biến đó. Đoạn trích đọc như sau:

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

Như có thể thấy đoạn mã này không khác nhiều so với các câu trả lời khác ngoại trừ việc nó có thể được định dạng tốt hơn. Một ưu điểm khác là nó là một phần của một gói các đoạn mã cho Java.


3
2017-10-09 13:55