Tìm kiếm các mẫu mã Java Eclipse hữu ích [đã đóng]


517

Bạn có thể tạo các mẫu mã Java khác nhau trong Eclipse thông qua

Cửa sổ> Tùy chọn> Java> Trình chỉnh sửa> Mẫu

ví dụ

sysout được mở rộng thành:

System.out.println(${word_selection}${});${cursor}

Bạn có thể kích hoạt điều này bằng cách gõ sysouttheo sauCTRL+SPACE

Những mẫu mã Java hữu ích nào hiện tại bạn đang sử dụng? Bao gồm tên và mô tả về nó và tại sao nó tuyệt vời.

Tôi đang tìm kiếm một bản gốc / tiểu thuyết sử dụng một mẫu chứ không phải là một tính năng hiện có.

  • Tạo logger Log4J
  • Nhận màu swt từ màn hình
  • Syncexec - Khung Eclipse
  • Mô hình Singleton / Enum Thế hệ Singleton
  • Đọc tài liệu
  • hăng sô
  • Truy ra
  • Chuỗi định dạng
  • Nhận xét mã nhận xét
  • Định dạng chuỗi
  • Thử khóa cuối cùng
  • Định dạng tin nhắn i18n và nhật ký
  • Người bình đẳng
  • Máy băm
  • Spring Object tiêm
  • Tạo FileOutputStream

5
Có ai tạo ra câu lệnh chuyển đổi từ Enum với tất cả các trường hợp có thể không? Tôi biết bạn có thể làm điều này với CTRL + 1, nhưng tôi muốn sử dụng hoàn thành cmd.
GreenKiwi

4
Bạn có thể giải thích những gì System.out.println(${word_selection}${});${cursor}có nghĩa là? Có vẻ như có một cách để chọn một từ và tự động đặt nó trong một sysoutcuộc gọi, phải không? Làm sao?
CodyBugstein

3
bạn làm nổi bật từ bạn muốn được bao quanh bởi cuộc gọi sysout và nhấn Ctrl-Space (sau đó nhập tên của mẫu nếu bạn có nhiều mẫu nhận biết nổi bật)
JReader

@JReader $ {} làm gì?
Roland

Câu trả lời:


423

Các mẫu mã sau đây sẽ vừa tạo một logger và tạo các bản nhập đúng, nếu cần.

SLF4J

${:import(org.slf4j.Logger,org.slf4j.LoggerFactory)}
private static final Logger LOG = LoggerFactory.getLogger(${enclosing_type}.class);

Log4J 2

${:import(org.apache.logging.log4j.LogManager,org.apache.logging.log4j.Logger)} 
private static final Logger LOG = LogManager.getLogger(${enclosing_type}.class); 

Log4J

${:import(org.apache.log4j.Logger)}
private static final Logger LOG = Logger.getLogger(${enclosing_type}.class);

Nguồn .

THÁNG 7

${:import(java.util.logging.Logger)}
private static final Logger LOG = Logger.getLogger(${enclosing_type}.class.getName());

31
Mát mẻ. Tôi không biết về $ {: import ...}.
JesperE

3
Tôi nghĩ $ {: import ...} chỉ hoạt động trong các phiên bản mới hơn của Eclipse. Tôi bị mắc kẹt với 3.2 và nó không hoạt động với tôi.
Adam Crume

Không phải trong phiên bản của tôi (3.5). Có ai biết nó được giới thiệu trong phiên bản nào không?
Finnw

5
Tôi thích nó! Nhưng tôi đặt $ {import ...} bên dưới khai báo Logger, để nó không thêm một dòng mới.
Dario Seidl

1
@TMS - đã thêm, cảm ơn!
Robert Munteanu

49

Một số mẫu bổ sung tại đây: Liên kết I - Liên kết II

Tôi thích cái này:

Đọc tài liệu

 ${:import(java.io.BufferedReader,  
           java.io.FileNotFoundException,  
           java.io.FileReader,  
           java.io.IOException)}  
 BufferedReader in = null;  
 try {  
    in = new BufferedReader(new FileReader(${fileName}));  
    String line;  
    while ((line = in.readLine()) != null) {  
       ${process}  
    }  
 }  
 catch (FileNotFoundException e) {  
    logger.error(e) ;  
 }  
 catch (IOException e) {  
    logger.error(e) ;  
 } finally {  
    if(in != null) in.close();  
 }  
 ${cursor} 

CẬP NHẬT : Phiên bản Java 7 của mẫu này là:

${:import(java.nio.file.Files,
          java.nio.file.Paths,
          java.nio.charset.Charset,
          java.io.IOException,
          java.io.BufferedReader)}
try (BufferedReader in = Files.newBufferedReader(Paths.get(${fileName:var(String)}),
                                                 Charset.forName("UTF-8"))) {
    String line = null;
    while ((line = in.readLine()) != null) {
        ${cursor}
    }
} catch (IOException e) {
    // ${todo}: handle exception
}

48
tôi nghĩ rằng đây là những gì một phương pháp dành cho :)
benmmurphy

3
Err Tôi nghĩ rằng bạn đã bỏ lỡ điểm ... nói rằng tôi thực sự không biết quan điểm của bạn là gì ... đó là về việc tạo mã không phải là mô đun ...
Jon

20
Tôi nghĩ vấn đề là việc thêm nhiều mã này vào một mẫu là lập trình cắt và dán cho một tình huống rất phổ biến.
Scott McIntyre

5
Có, bạn nên sử dụng một phương thức tiện ích để đọc tệp thay vì dán các khối mã. Tự viết một phương thức hoặc sử dụng Apache commons-io IOUtils. Tuy nhiên, nếu bạn thực hiện nhiều dự án vứt đi với các đường dẫn lớp khác nhau, việc thêm JAR hoặc liên kết trong lớp tiện ích của bạn chỉ để đọc một tệp là một nỗi đau. Đôi khi bạn chỉ cần viết một số mã bỏ đi đọc một tệp và tiếp tục cuộc sống của bạn.
Mike Clark

1
Trong Java 7, thích StandardCharsets.UTF_8hơn Charset.forName("UTF-8").
Mike Clark

33

Định dạng một chuỗi

MessageFormat - bao quanh vùng chọn bằng MessageFormat.

 ${:import(java.text.MessageFormat)} 
 MessageFormat.format(${word_selection}, ${cursor})

Điều này cho phép tôi di chuyển con trỏ đến một chuỗi, mở rộng vùng chọn thành toàn bộ chuỗi (Shift-Alt-Up), sau đó Ctrl-Space hai lần.

Khóa lựa chọn

khóa - bao quanh các dòng đã chọn bằng khóa thử cuối cùng. Giả sử sự hiện diện của một biến khóa.

${lock}.acquire();
try {
    ${line_selection}
    ${cursor}
} finally {
    ${lock}.release();
}

Các ${line_selection}mẫu NB hiển thị trong menu Surround With (Alt-Shift-Z).


Tôi sử dụng cái này kết hợp với các câu lệnh log: logger.info (MessageFormat.format ($ {word_selection}, $ {con trỏ});
Pierre Henry

Các phương thức để có được và giải phóng các khóa được gọi lockunlock. acquirereleaseđược sử dụng cho semaphores và việc sử dụng chúng trong một khối thử cuối cùng không được khuyến khích mạnh mẽ như với khóa .
Marco Lackovic

Ctrl + Space hai lần dường như không hoạt động nữa, hiển thị các mẫu SWT. Có một sự thay thế?
Noumenon

28

Tôi biết tôi đang đá một bài chết, nhưng muốn chia sẻ điều này để hoàn thành:

Một phiên bản chính xác của mẫu thế hệ đơn, vượt qua thiết kế khóa được kiểm tra hai lần thiếu sót (đã thảo luận ở trên và được đề cập ở nơi khác)

Mẫu tạo đơn: Đặt tên nàycreatesingleton

static enum Singleton {
    INSTANCE;

    private static final ${enclosing_type} singleton = new ${enclosing_type}();

    public ${enclosing_type} getSingleton() {
        return singleton;
    }
}
${cursor}


Để truy cập singletons được tạo bằng cách sử dụng ở trên:

Mẫu tham chiếu Singleton: Đặt tên này getsingleton:

${type} ${newName} = ${type}.Singleton.INSTANCE.getSingleton();

4
Nó không chết, đó là wiki cộng đồng, vì vậy sẽ rất hợp lý khi thêm nhiều mẫu vào đó khi bạn tìm thấy chúng. Không thực sự có một bộ toàn diện những thứ này ở bất cứ nơi nào khác ...
Jon

Jon, khoảng cách thời gian giữa bài viết trước đó và bài viết của tôi là gần 8 tháng, đó là những gì buộc phải trích dẫn như vậy. Tôi không thể diễn đạt nó tốt hơn bình luận của bạn :)
Questzen

Khi tôi tạo nó như là một phần của một lớp (một enum lồng nhau trong một lớp) tôi có được tên của lớp như ${enclosing_type}dự định không?
Mr_and_Mrs_D

1
@Mr_and_Mrs_D, tôi nghĩ đó là điểm chính. Bạn nhận được một ví dụ đơn lẻ của lớp mà bạn đặt mẫu này. Bây giờ tất cả những gì bạn cần làm là đặt (các) hàm tạo kiểu kèm theo ở chế độ riêng tư và có một trình tạo singleton khá an toàn.
Mike Adler

Nếu bạn muốn sử dụng điều này để tạo một ${primary_type_name}ví dụ sử dụng enum :public enum ${primary_type_name} { INSTANCE; private ${return_type} ${name} = new ${return_type}(); public ${return_type} ${getName}(${}) { return ${name}; } ${cursor} }
Robert Smit

28

Nối đoạn mã để lặp lại Map.entrySet():

Bản mẫu:

${:import(java.util.Map.Entry)}
for (Entry<${keyType:argType(map, 0)}, ${valueType:argType(map, 1)}> ${entry} : ${map:var(java.util.Map)}.entrySet())
{
    ${keyType} ${key} = ${entry}.getKey();
    ${valueType} ${value} = ${entry}.getValue();
    ${cursor}
}

Mã được tạo:

for (Entry<String, String> entry : properties.entrySet())
{
    String key = entry.getKey();
    String value = entry.getValue();
    |
}

Ảnh chụp màn hình


1
Giống như pic của bạn, nó cho tôi thấy bạn có thể sử dụng một biến trong ${}đó, thay vì ${cursor}, cho phép "lặp lại tab" giữa các trường. Cảm ơn.
WesternGun

25

Đối với log, một ditty nhỏ hữu ích để thêm vào biến thành viên.

private static Log log = LogFactory.getLog(${enclosing_type}.class);

Để ghi vào tệp nhật ký theo cách thủ công: $ {: import (java.io.PrintWriter, java.io.BufferedWriter, java.io.FileWriter)} hãy thử {PrintWriter out = new PrintWriter (new BufferedWriter (new FileWriter (new FileWriter (new FileWriter) var (Chuỗi)}, đúng))); out.println ($ {logLine: var (Chuỗi)} $ {con trỏ}); out.c Đóng (); } Catch (IOException e) {/ * TODO: xử lý ngoại lệ * / e.printStackTrace (); }
Jack Miller

24

Tạo một bản giả với Mockito (trong ngữ cảnh "các câu lệnh Java"):

${:importStatic('org.mockito.Mockito.mock')}${Type} ${mockName} = mock(${Type}.class);

Và trong "thành viên kiểu Java":

${:import(org.mockito.Mock)}@Mock
${Type} ${mockName};

Giả định một phương thức void để ném một ngoại lệ:

${:import(org.mockito.invocation.InvocationOnMock,org.mockito.stubbing.Answer)}
doThrow(${RuntimeException}.class).when(${mock:localVar}).${mockedMethod}(${args});

Mock một phương thức void để làm một cái gì đó:

${:import(org.mockito.invocation.InvocationOnMock,org.mockito.stubbing.Answer)}doAnswer(new Answer<Object>() {
public Object answer(InvocationOnMock invocation) throws Throwable {
    Object arg1 = invocation.getArguments()[0];
    return null;
}
}).when(${mock:localVar}).${mockedMethod}(${args});

Xác minh phương thức giả được gọi chính xác một lần:

${:importStatic(org.mockito.Mockito.verify,org.mockito.Mockito.times)}
verify(${mock:localVar}, times(1)).${mockMethod}(${args});

Xác minh phương thức giả định không bao giờ được gọi:

${:importStatic(org.mockito.Mockito.verify,org.mockito.Mockito.never)}verify(${mock:localVar}, never()).${mockMethod}(${args});

Danh sách được liên kết mới bằng Google Guava (và tương tự cho hashset và hashmap):

${import:import(java.util.List,com.google.common.collect.Lists)}List<${T}> ${newName} = Lists.newLinkedList();

Ngoài ra tôi sử dụng một khuôn mẫu lớn tạo ra một lớp Test. Đây là một đoạn ngắn của nó mà mọi người quan tâm nên tùy chỉnh:

package ${enclosing_package};

import org.junit.*;
import static org.junit.Assert.*;
import static org.hamcrest.Matchers.*;
import static org.mockito.Matchers.*;
import static org.mockito.Mockito.*;
import org.mockito.Mockito;
import org.slf4j.Logger;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import org.junit.runner.RunWith;

// TODO autogenerated test stub
@RunWith(MockitoJUnitRunner.class)
public class ${primary_type_name} {

    @InjectMocks
    protected ${testedType} ${testedInstance};
    ${cursor}

    @Mock
    protected Logger logger;

    @Before
    public void setup() throws Exception {
    }

    @Test
    public void shouldXXX() throws Exception {
        // given

        // when
        // TODO autogenerated method stub

        // then
        fail("Not implemented.");
    }
}
// Here goes mockito+junit cheetsheet

1
Tôi tò mò: tại sao bạn cần phải chế nhạo logger?
Vladimir Sizikov

6
bạn có thể xác minh logger giả được gọi trong trường hợp ngoại lệ bị bắt (kịch bản lỗi). điều đó đặc biệt hữu ích nếu bạn không có ý định nghĩ lại nhưng muốn khẳng định nó không âm thầm bỏ qua.
mantrid

23

Kiểm tra Null!

if( ${word_selection} != null ){
    ${cursor}
}

if( ${word_selection} == null ){
    ${cursor}
}

Các PreConditions.checkNotNull(...)phương pháp trong Ổi là một thay thế rất có thể đọc được (đặc biệt là với hàng nhập khẩu tĩnh)
Thorbjørn Ravn Andersen

Đó là cách tốt nhất để kiểm tra null (== null) trước khi kiểm tra không null.
KrishPrabakar

21

Một trong những người thân yêu của tôi là foreach :

for (${iterable_type} ${iterable_element} : ${iterable}) {
    ${cursor}
}

Và theo dõi , vì tôi đang sử dụng nó rất nhiều để theo dõi:

System.out.println("${enclosing_type}.${enclosing_method}()");

Tôi chỉ nghĩ về một cái khác và đã tìm thấy nó qua Internet một ngày nào đó, const :

private static final ${type} ${name} = new ${type} ${cursor};

11
foreach có sẵn dưới dạng hỗ trợ mã tiêu chuẩn trong Eclipse, tôi không thấy rằng mẫu của bạn làm bất cứ điều gì bổ sung cho phiên bản tiêu chuẩn
Người bán giàu vào

4
Phải, và sysout là mẫu rất sáng tạo. Câu hỏi liên quan đến, các mẫu hữu ích chúng tôi đang sử dụng.
Artem Barger

4
của bạn traceoutđã có sẵn trong Eclipse như systrace.
dogbane

7
Thật tuyệt, tôi muốn tin rằng nó xuất hiện ngay bây giờ trong Eclipse do câu hỏi này.
Artem Barger

const có sẵn dưới dạng mã tiêu chuẩn hỗ trợ dưới dạng static_final (không chắc chắn khi được thêm vào)
Armand

20

Một mẹo nhỏ về sysout - Tôi muốn đổi tên nó thành "sop". Không có gì khác trong java libs bắt đầu bằng "sop" để bạn có thể nhanh chóng gõ "sop" và boom, nó chèn vào.


11
Theo mặc định, chỉ cần gõ syso sẽ làm tương tự như sysout.
MasterScrat

9
Đánh bại bạn 25% với sop, mặc dù ...;)
Scott Stanchfield

2
Vì Sao Hỏa Eclipse có một bước lùi kém trên phím tắt "syso" + Ctrl + Space : nó sẽ liệt kê một số lớp có các ký tự s, y, s và o trong tên của chúng (do tìm thấy CamelCase mới). Vì vậy, bây giờ bạn phải chọn thêm sysout từ danh sách và nhấn Return.
bobbel

17

Ném một IllegalArgumentException với biến trong phạm vi hiện tại (ảo ảnh):

throw new IllegalArgumentException(${var});

Tốt hơn

throw new IllegalArgumentException("Invalid ${var} " + ${var});  

14

Không có gì lạ mắt cho việc sản xuất mã - nhưng khá hữu ích cho việc đánh giá mã

Tôi có coderev mẫu của tôi thấp / med / high làm như sau

/**
 * Code Review: Low Importance
 * 
 *
 * TODO: Insert problem with code here 
 *
 */

Và sau đó trong chế độ xem Nhiệm vụ - sẽ hiển thị cho tôi tất cả các nhận xét đánh giá mã mà tôi muốn đưa ra trong cuộc họp.


14

Một số mẫu khác ở đây .

Bao gồm:

  • Tạo một đối tượng ngày từ một ngày cụ thể
  • Tạo một ArrayList chung mới
  • Thiết lập logger
  • Đăng nhập với mức quy định
  • Tạo một HashMap chung mới
  • Lặp lại qua bản đồ, in các khóa và giá trị
  • Phân tích thời gian bằng SimpleDateFormat
  • Đọc một dòng tập tin theo dòng
  • Đăng nhập và suy nghĩ lại một ngoại lệ bị bắt
  • Thời gian thực hiện in của một khối mã
  • Tạo bộ đếm thời gian định kỳ
  • Viết một chuỗi vào một tập tin

đã thêm một liên kết máy wayback
berezovskyi

12

đăng nhập slf4j

${imp:import(org.slf4j.Logger,org.slf4j.LoggerFactory)}

private static final Logger LOGGER = LoggerFactory
    .getLogger(${enclosing_type}.class);

10

Đậu tài sản

private ${Type} ${property};

public ${Type} get${Property}() {
    return ${property};
}

public void set${Property}(${Type} ${property}) {
    ${propertyChangeSupport}.firePropertyChange("${property}", this.${property},     this.${property} = ${property});
}

PropertyChangeSupport

private PropertyChangeSupport ${propertyChangeSupport} = new PropertyChangeSupport(this);${:import(java.beans.PropertyChangeSupport,java.beans.PropertyChangeListener)}
public void addPropertyChangeListener(PropertyChangeListener listener) {
  ${propertyChangeSupport}.addPropertyChangeListener(listener);
}

public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) {
  ${propertyChangeSupport}.addPropertyChangeListener(propertyName, listener);
}

public void removePropertyChangeListener(PropertyChangeListener listener) {
  ${propertyChangeSupport}.removePropertyChangeListener(listener);
}

public void removePropertyChangeListener(String propertyName, PropertyChangeListener listener) {
  ${propertyChangeSupport}.removePropertyChangeListener(propertyName, listener);
}

10

Đăng Java 7, một cách tuyệt vời để thiết lập các logger cần (hoặc thích) các tham chiếu tĩnh đến lớp kèm theo là sử dụng API Phương thức mới được giới thiệu để có được lớp thời gian chạy trong ngữ cảnh tĩnh.

Một đoạn ví dụ cho SLF4J là:

private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());

Ngoài việc là một đoạn mã đơn giản trong bất kỳ IDE nào, nó cũng sẽ dễ vỡ hơn nếu bạn tái cấu trúc một số chức năng nhất định sang một lớp khác vì bạn sẽ không vô tình mang tên lớp với nó.


9

Gọi mã trên luồng GUI

Tôi liên kết mẫu sau với phím tắt slaterđể nhanh chóng gửi mã trên luồng GUI.

${:import(javax.swing.SwingUtilities)}
SwingUtilities.invokeLater(new Runnable() {      
      @Override
      public void run() {
        ${cursor}
      }
    });

9

Khi kiểm tra xung quanh với mã đôi khi tôi đã bỏ lỡ việc xóa một số syso s. Vì vậy, tôi đã tạo cho mình một mẫu gọi là syt .

System.out.println(${word_selection}${});//${todo}:remove${cursor}

Trước khi biên dịch, tôi luôn kiểm tra các TODO của mình và sẽ không bao giờ quên xóa System.out nữa.


9

strf -> String.format("msg", args) khá đơn giản nhưng tiết kiệm một chút gõ.

String.format("${cursor}",)

6
Tôi sử dụng String.format("${string}",${objects})vì Eclipse cho phép tôi tab giữa chuỗi của tôi và danh sách các đối tượng của tôi.
Duncan Jones

Tôi sử dụng phiên bản này : String.format(${word_selection}${},)${cursor}, đầu tiên chọn một chuỗi sau đó sử dụng 'sf' trên chuỗi đó. Thêm% s và cứ thế ...
Barshe Roussy

8

Nhận màu SWT từ màn hình hiện tại:

Display.getCurrent().getSystemColor(SWT.COLOR_${cursor})

Tuyệt vời với syncexec

PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable(){
    public void run(){
        ${line_selection}${cursor}
    }
});

Sử dụng mẫu thiết kế singleton:

/**
 * The shared instance.
 */
private static ${enclosing_type} instance = new ${enclosing_type}();

/**
 * Private constructor.
 */
private ${enclosing_type}() {
    super();
}

/**
 * Returns this shared instance.
 *
 * @returns The shared instance
 */
public static ${enclosing_type} getInstance() {
    return instance;
}

3
Chỉ cần một ghi chú nhanh - Theo Maestro được gọi là Joshua Bloch sử dụng Enum nên là phương pháp ưa thích để tạo ra các singletons trong Java.
Pablojim

Xin chào Pablojim, Kể từ khi tôi đăng mẫu này, tôi bắt đầu đọc Java hiệu quả và tôi đã thay đổi các triển khai singletons của mình thành enum. Tuy nhiên, tôi đã không tìm ra cách để có mẫu tạo enum và do đó sửa đổi khai báo lớp. Bạn đã có mẫu này? Cảm ơn Manu
Manuel Selva

FYI: Đây là mẫu enum singleton electrotek.wordpress.com/2008/08/06/ . Tôi không đặc biệt thích nó nhưng sau đó tôi không có nhiều singletons. Thật dễ dàng để biến điều này thành một mẫu Java.
pjp

1
Đối với cách tiếp cận enum, tôi hy vọng tất cả các singletons của bạn có ý nghĩa như các đối tượng có thể so sánh, nối tiếp, bởi vì rất nhiều Singletons không (và anh ta tự hỏi tại sao "... cách tiếp cận này vẫn chưa được áp dụng rộng rãi" - bởi vì khả năng so sánh và tuần tự hóa 'không có ý nghĩa đối với một số lớp học đơn lẻ!)
MetroidFan2002

Nối tiếp? Đúng. Xem xét việc tuần tự hóa một Đối tượng có tham chiếu đến Singleton của bạn. Nếu nó không được nối tiếp, thì bạn có thể gặp NPE. Nếu đó là (và bạn không thêm các phương thức để ghi đè khử tuần tự mặc định), thì bạn có thể lấy một phiên bản khác của "Singleton".
Julian Kuhn

8

Và một người chơi cân bằng, thích ứng hashcodebuilder:

${:import(org.apache.commons.lang.builder.EqualsBuilder,org.apache.commons.lang.builder.HashCodeBuilder)}
@Override
public boolean equals(Object obj) {
    return EqualsBuilder.reflectionEquals(this, obj);
}

@Override
public int hashCode() {
    return HashCodeBuilder.reflectionHashCode(this);
}

Đối với một giải pháp mà không có phản ánh, xem câu trả lời của tôi dưới đây liên kết
gswierczynski

8

Các mẫu cho khai báo logger là tuyệt vời.

Tôi cũng tạo linfo, ldebug, lwarn, lerror cho các mức log mà tôi sử dụng thường xuyên hơn.

người cho vay:

logger.error(${word_selection}${});${cursor}

8

Tạo mọi thứ cho một sự kiện

Vì các sự kiện hơi khó tạo ra trong Java - tất cả các giao diện, phương thức và công cụ để viết chỉ cho 1 sự kiện - Tôi đã tạo một mẫu đơn giản để tạo mọi thứ cần thiết cho 1 sự kiện.

${:import(java.util.List, java.util.LinkedList, java.util.EventListener, java.util.EventObject)}

private final List<${eventname}Listener> ${eventname}Listeners = new LinkedList<${eventname}Listener>();

public final void add${eventname}Listener(${eventname}Listener listener)
{
    synchronized(${eventname}Listeners) {
        ${eventname}Listeners.add(listener);
    }
}

public final void remove${eventname}Listener(${eventname}Listener listener)
{
    synchronized(${eventname}Listeners) {
        ${eventname}Listeners.remove(listener);
    }
}

private void raise${eventname}Event(${eventname}Args args)
{
    synchronized(${eventname}Listeners) {
        for(${eventname}Listener listener : ${eventname}Listeners)
            listener.on${eventname}(args);
    }
}

public interface ${eventname}Listener extends EventListener
{
    public void on${eventname}(${eventname}Args args);
}

public class ${eventname}Args extends EventObject
{
    public ${eventname}Args(Object source${cursor})
    {
        super(source);
    }
}

Nếu bạn có các sự kiện chia sẻ một sự kiện EventObject, chỉ cần xóa một sự kiện tùy chỉnh được chèn bởi mẫu và thay đổi các phần thích hợp của raise___()on____().

Tôi đã viết một cơ chế tạo sự kiện đẹp, nhỏ, thanh lịch bằng cách sử dụng một giao diện chung và lớp chung, nhưng nó sẽ không hoạt động do cách Java xử lý các tổng quát. = (

Chỉnh sửa : 1) Tôi gặp phải vấn đề trong đó các chủ đề đang thêm / xóa người nghe trong khi một sự kiện đang diễn ra. Các Listkhông thể được sửa đổi trong khi sử dụng, vì vậy tôi thêm synchronizedkhối nơi danh sách các thính giả đang được truy cập hoặc sử dụng, khóa thuộc danh mục riêng của mình.


Gửi các sự kiện trong khi đang ở trong một khóa (đồng bộ hóa hoặc cách khác) là một bế tắc chờ đợi để xảy ra. Trong trường hợp này, tốt hơn là sao chép trình nghe trong khi ở trong một khối được đồng bộ hóa và lặp lại danh sách mới.
ssindelar 14/03/2015

Sử dụng một concueLinkedQueue . Nó không yêu cầu khóa, bởi vì nó có một trình vòng lặp nhất quán yếu, không bao giờ ném ra một concExModificationException.
Stefan Dollase

8

Chèn các phương thức kiểm tra nên cho trước khi đó

Tôi đã thấy một phiên bản tương tự như phiên bản này gần đây trong khi lập trình cặp với một nhà phát triển và bạn bè rất tốt, và tôi nghĩ rằng nó có thể là một bổ sung tốt cho danh sách này.

Mẫu này sẽ tạo một phương thức thử nghiệm mới trên một lớp, theo cách tiếp cận Cho - Khi - Sau đó từ mô hình phát triển theo hướng hành vi (BDD) trên các nhận xét, như một hướng dẫn để cấu trúc mã. Nó sẽ bắt đầu tên phương thức bằng "nên" và cho phép bạn thay thế phần còn lại của tên phương thức giả "Check ThisAndThat" bằng mô tả tốt nhất có thể về trách nhiệm của phương thức thử nghiệm. Sau khi điền tên, TAB sẽ đưa bạn thẳng đến // Given section, để bạn có thể bắt đầu nhập các điều kiện tiên quyết của mình.

Tôi đã ánh xạ tới ba chữ cái "tst", với mô tả "Các phương thức kiểm tra nên cho trước khi đó";)

Tôi hy vọng bạn thấy nó hữu ích như tôi đã làm khi tôi thấy nó:

@Test
public void should${CheckThisAndThat}() {
    Assert.fail("Not yet implemented");
    // Given
    ${cursor}

    // When


    // Then

}${:import(org.junit.Test, org.junit.Assert)}

Tôi thích mẫu đó. Tôi đã thêm một "ngoại lệ ném" để giảm bớt sự thoải mái khi thử nghiệm thêm.
Torves

Tôi thích mô hình của BDD. Mẫu rất đẹp cho điều đó. Và chỉ cần một lưu ý: rất tốt nhà phát triển và bạn bè của bạn đã biến mất!
bobbel

7

Tiêm mùa xuân

Tôi biết điều này là muộn của trò chơi, nhưng đây là một trò chơi tôi sử dụng cho Spring tiêm trong một lớp:

${:import(org.springframework.beans.factory.annotation.Autowired)}
private ${class_to_inject} ${var_name};

@Autowired
public void set${class_to_inject}(${class_to_inject} ${var_name}) {
  this.${var_name} = ${var_name};
}

public ${class_to_inject} get${class_to_inject}() {
  return this.${var_name};
}

7

Đây là một hàm tạo cho các lớp không thể thực hiện được:

// Suppress default constructor for noninstantiability
@SuppressWarnings("unused")
private ${enclosing_type}() {
    throw new AssertionError();
}

Đây là một ngoại lệ tùy chỉnh:

/**
 * ${cursor}TODO Auto-generated Exception
 */
public class ${Name}Exception extends Exception {
    /**
     * TODO Auto-generated Default Serial Version UID
     */
    private static final long serialVersionUID = 1L;    

    /**
     * @see Exception#Exception()
     */
    public ${Name}Exception() {
        super();
    }

    /**
     * @see Exception#Exception(String) 
     */
    public ${Name}Exception(String message) {
        super(message);         
    }

    /**
     * @see Exception#Exception(Throwable)
     */
    public ${Name}Exception(Throwable cause) {
        super(cause);           
    }

    /**
     * @see Exception#Exception(String, Throwable)
     */
    public ${Name}Exception(String message, Throwable cause) {
        super(message, cause);
    }
}

5

Tôi thích một nhận xét lớp được tạo như thế này:

/**
 * I... 
 * 
 * $Id$
 */

"Tôi ..." ngay lập tức khuyến khích nhà phát triển mô tả những gì lớp làm. Tôi dường như cải thiện vấn đề của các lớp học không có giấy tờ.

Và tất nhiên, $ Id $ là một từ khóa CVS hữu ích.


5

Tôi đã sử dụng rất nhiều đoạn trích này, tìm kiếm các nullgiá trị và chuỗi trống.

Tôi sử dụng "kiểm tra đối số" -tem mẫu làm mã đầu tiên trong các phương thức của mình để kiểm tra các đối số nhận được.

testNullArgument

if (${varName} == null) {
    throw new NullPointerException(
        "Illegal argument. The argument cannot be null: ${varName}");
}

Bạn có thể muốn thay đổi thông báo ngoại lệ để phù hợp với tiêu chuẩn của công ty hoặc dự án của bạn. Tuy nhiên, tôi khuyên bạn nên có một số thông báo bao gồm tên của đối số vi phạm. Nếu không, người gọi phương thức của bạn sẽ phải xem mã để hiểu những gì đã sai. (MộtNullPointerException không có tin nhắn tạo ra một ngoại lệ với thông điệp khá vô nghĩa "null").

testNullOrEmptyStringArgument

if (${varName} == null) {
    throw new NullPointerException(
        "Illegal argument. The argument cannot be null: ${varName}");
}
${varName} = ${varName}.trim();
if (${varName}.isEmpty()) {
    throw new IllegalArgumentException(
        "Illegal argument. The argument cannot be an empty string: ${varName}");
}

Bạn cũng có thể sử dụng lại mẫu kiểm tra null từ phía trên và triển khai đoạn mã này để chỉ kiểm tra các chuỗi trống. Sau đó, bạn sẽ sử dụng hai mẫu đó để tạo mã ở trên.

Tuy nhiên, mẫu ở trên có một vấn đề là nếu đối số là cuối cùng, bạn sẽ phải sửa đổi một số mã được sản xuất ( ${varName} = ${varName}.trim() sẽ thất bại).

Nếu bạn sử dụng nhiều đối số cuối cùng và muốn kiểm tra các chuỗi trống nhưng không phải cắt chúng thành một phần của mã, bạn có thể đi với điều này thay thế:

if (${varName} == null) {
    throw new NullPointerException(
        "Illegal argument. The argument cannot be null: ${varName}");
}
if (${varName}.trim().isEmpty()) {
    throw new IllegalArgumentException(
        "Illegal argument. The argument cannot be an empty string: ${varName}");
}

testNullFieldState

Tôi cũng đã tạo một số đoạn mã để kiểm tra các biến không được gửi dưới dạng đối số (sự khác biệt lớn là loại ngoại lệ, bây giờ là một IllegalStateExceptionthay thế).

if (${varName} == null) {
    throw new IllegalStateException(
        "Illegal state. The variable or class field cannot be null: ${varName}");
}

testNullOrEmptyStringFieldState

if (${varName} == null) {
    throw new IllegalStateException(
        "Illegal state. The variable or class field cannot be null: ${varName}");
}
${varName} = ${varName}.trim();
if (${varName}.isEmpty()) {
    throw new IllegalStateException(
        "Illegal state. The variable or class field " +
            "cannot be an empty string: ${varName}");
}

kiểm tra

Đây là một mẫu chung để kiểm tra một biến. Tôi đã mất vài năm để thực sự học cách đánh giá cao cái này, bây giờ tôi sử dụng nó rất nhiều (kết hợp với các mẫu trên tất nhiên!)

if (!(${varName} ${testExpression})) {
    throw new IllegalArgumentException(
        "Illegal argument. The argument ${varName} (" + ${varName} + ") " +
        "did not pass the test: ${varName} ${testExpression}");
}

Bạn nhập tên biến hoặc điều kiện trả về giá trị, theo sau là toán hạng ("==", "<", ">" v.v.) và một giá trị hoặc biến khác và nếu kiểm tra thất bại, mã kết quả sẽ ném IllegalArgumentException.

Lý do cho mệnh đề if hơi phức tạp, với toàn bộ biểu thức được gói trong "! ()" Là để có thể sử dụng lại điều kiện kiểm tra trong thông báo ngoại lệ.

Có lẽ nó sẽ gây nhầm lẫn cho một đồng nghiệp, nhưng chỉ khi họ phải xem mã, điều mà họ có thể không phải làm nếu bạn ném những loại ngoại lệ này ...

Dưới đây là một ví dụ với mảng:

public void copy(String[] from, String[] to) {
    if (!(from.length == to.length)) {
        throw new IllegalArgumentException(
                "Illegal argument. The argument from.length (" +
                            from.length + ") " +
                "did not pass the test: from.length == to.length");
    }
}

Bạn nhận được kết quả này bằng cách gọi lên mẫu, gõ "from.length" [TAB] "== to.length".

Kết quả là thú vị hơn một "ArrayIndexOutOfBoundException" hoặc tương tự và thực sự có thể cung cấp cho người dùng của bạn một cơ hội để tìm ra vấn đề.

Thưởng thức!


4

Tôi sử dụng cái này cho MessageFormat (sử dụng Java 1.4). Bằng cách đó, tôi chắc chắn rằng tôi không có kết nối nào khó trích xuất khi thực hiện quốc tế hóa

i18n

String msg = "${message}";
Object[] params = {${params}};
MessageFormat.format(msg, params);

Ngoài ra để đăng nhập:

đăng nhập

if(logger.isDebugEnabled()){
  String msg = "${message}"; //NLS-1
  Object[] params = {${params}};
  logger.debug(MessageFormat.format(msg, params));
}

4

Một vài yêu thích của tôi là ...

1: Javadoc, để chèn doc về phương thức là phương thức tiêm đối tượng Spring.

 Method to set the <code>I${enclosing_type}</code> implementation that this class will use.
* 
* @param ${enclosing_method_arguments}<code>I${enclosing_type}</code> instance 

2: Cửa sổ gỡ lỗi, để tạo FileOutputStream và ghi nội dung của bộ đệm vào một tệp. Được sử dụng khi bạn muốn so sánh bộ đệm với lần chạy trước (sử dụng BeyondCompare) hoặc nếu bạn không thể xem nội dung của bộ đệm (thông qua kiểm tra) vì nó quá lớn ...

java.io.FileOutputStream fos = new java.io.FileOutputStream( new java.io.File("c:\\x.x"));
fos.write(buffer.toString().getBytes());
fos.flush();
fos.close();
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.