Mencari templat kode Java Eclipse yang berguna [ditutup]

516

Anda dapat membuat berbagai templat kode Java di Eclipse via

Window> Preferences> Java> Editor> Templates

misalnya

sysout diperluas ke:

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

Anda dapat mengaktifkan ini dengan mengetik sysoutdiikuti olehCTRL+SPACE

Template kode Java apa yang bermanfaat yang saat ini Anda gunakan? Sertakan nama dan uraiannya serta mengapa itu keren.

Saya mencari penggunaan template asli / novel daripada fitur bawaan yang ada.

  • Buat Log4J logger
  • Dapatkan warna swt dari tampilan
  • Syncexec - Kerangka Eclipse
  • Singleton Pattern / Enum Singleton Generation
  • Bacafile
  • Const
  • Menelusuri
  • Format String
  • Ulasan Kode Komentar
  • Format string
  • Coba Akhirnya Kunci
  • Format Pesan i18n dan log
  • Equalsbuilder
  • Pembuat Hashcodebuilder
  • Injeksi Objek Pegas
  • Buat FileOutputStream
Jon
sumber
5
Apakah ada yang menghasilkan pernyataan beralih dari Enum dengan semua kasus yang mungkin? Saya tahu Anda bisa melakukan ini dengan CTRL + 1, tapi saya lebih suka menggunakan cmd.
GreenKiwi
4
Bisakah Anda menjelaskan apa System.out.println(${word_selection}${});${cursor}artinya? Sepertinya ada cara untuk memilih kata dan secara otomatis membungkusnya di dalam sysoutpanggilan, apakah saya benar? Bagaimana?
CodyBugstein
3
Anda menyorot kata yang ingin dikelilingi oleh panggilan sysout dan tekan Ctrl-Space (lalu ketikkan nama templat jika Anda memiliki banyak templat sadar sorot)
JReader
@JReader apa yang $ {} lakukan?
Roland

Jawaban:

423

Templat kode berikut akan membuat logger dan membuat impor yang tepat, jika perlu.

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

Sumber .

JULI

${:import(java.util.logging.Logger)}
private static final Logger LOG = Logger.getLogger(${enclosing_type}.class.getName());
Robert Munteanu
sumber
31
Keren. Saya tidak tahu tentang $ {: import ...} thingy.
JesperE
3
Saya pikir $ {: import ...} hanya berfungsi di versi Eclipse yang lebih baru. Saya terjebak dengan 3.2 dan tidak berfungsi untuk saya.
Adam Crume
Juga tidak dalam versi saya (3.5). Adakah yang tahu di versi mana ia diperkenalkan?
finnw
5
Aku menyukainya! Tapi saya meletakkan $ {import ...} di bawah deklarasi Logger, sehingga tidak menambahkan baris baru.
Dario Seidl
1
@TMS - ditambahkan, terima kasih!
Robert Munteanu
49

Beberapa templat tambahan di sini: Tautan I - Tautan II

Saya suka yang ini:

readfile

 ${: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} 

UPDATE : Versi Java 7 dari templat ini adalah:

${: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
}
Jon
sumber
48
saya pikir ini adalah apa metode adalah untuk :)
benmmurphy
3
Err Saya pikir Anda telah kehilangan titik ... mengatakan bahwa saya benar-benar tidak tahu apa maksud Anda adalah ... ini tentang kode generasi tidak modularitas ...
Jon
20
Saya pikir intinya adalah bahwa menambahkan kode sebanyak ini dalam template adalah pemrograman cut-and-paste untuk situasi yang sangat umum.
Scott McIntyre
5
Ya, Anda harus menggunakan metode utilitas untuk membaca file alih-alih menempelkan blok kode. Tulis metode sendiri, atau gunakan Apache commons-io IOUtils. Namun, jika Anda membuat banyak proyek sekali pakai dengan jalan kelas yang berbeda, akan sangat sulit untuk menambahkan JAR atau tautan di kelas utilitas Anda hanya untuk membaca file. Terkadang Anda hanya perlu menulis beberapa kode sekali pakai yang membaca file, dan melanjutkan hidup Anda.
Mike Clark
1
Di Java 7, lebih suka di StandardCharsets.UTF_8atas Charset.forName("UTF-8").
Mike Clark
33

Memformat string

MessageFormat - mengelilingi pilihan dengan MessageFormat.

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

Ini memungkinkan saya memindahkan kursor ke string, memperluas pilihan ke seluruh string (Shift-Alt-Up), lalu Ctrl-Space dua kali.

Kunci pilihan

kunci - mengelilingi garis yang dipilih dengan mencoba akhirnya mengunci. Asumsikan ada variabel kunci.

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

${line_selection}Templat NB muncul di menu Surround With (Alt-Shift-Z).

jamesh
sumber
Saya menggunakan ini dikombinasikan dengan pernyataan log: logger.info (MessageFormat.format ($ {word_selection}, $ {cursor});
Pierre Henry
Metode untuk mendapatkan dan melepaskan kunci disebut lockdan unlock. acquiredan releasedigunakan untuk semaphores dan penggunaannya dalam blok try-akhirnya tidak begitu disarankan seperti dengan kunci .
Marco Lackovic
Ctrl + Space dua kali tampaknya tidak berfungsi lagi, menampilkan template SWT. Apakah ada penggantinya?
Noumenon
28

Saya tahu saya menendang tiang yang mati, tetapi ingin membagikan ini demi penyelesaian:

Versi yang benar dari templat generasi tunggal, yang mengatasi desain penguncian ganda yang cacat (dibahas di atas dan disebutkan di tempat lain)

Templat Pembuatan Singleton: Beri nama inicreatesingleton

static enum Singleton {
    INSTANCE;

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

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


Untuk mengakses lajang yang dihasilkan menggunakan di atas:

Templat referensi Singleton: Beri nama ini getsingleton:

${type} ${newName} = ${type}.Singleton.INSTANCE.getSingleton();
questzen
sumber
4
Itu tidak mati, ini adalah wiki komunitas, jadi masuk akal untuk menambahkan lebih banyak templat saat Anda menemukannya. Tidak ada satu pun yang lengkap dari ini di tempat lain ...
Jon
Jon, jarak waktu antara posting sebelumnya dan posting saya hampir 8 bulan, itulah yang harus dikutip begitu. Saya tidak bisa mengungkapkannya dengan lebih baik daripada komentar Anda :)
questzen
Ketika saya membuat ini sebagai bagian dari kelas (enum bersarang di kelas) saya mendapatkan nama kelas sebagaimana ${enclosing_type}dimaksud?
Mr_and_Mrs_D
1
@ Mr_and_Mrs_D, saya pikir itu intinya. Anda mendapatkan contoh tunggal dari kelas tempat Anda meletakkan templat ini. Sekarang semua yang perlu Anda lakukan adalah membuat konstruktor tipe terlampir privat dan memiliki generator tunggal yang cukup aman.
Mike Adler
Jika Anda ingin menggunakan ini untuk membuat ${primary_type_name}contoh penggunaan enum :public enum ${primary_type_name} { INSTANCE; private ${return_type} ${name} = new ${return_type}(); public ${return_type} ${getName}(${}) { return ${name}; } ${cursor} }
Robert Smit
28

Tambahkan potongan kode untuk diulangi Map.entrySet():

Templat:

${: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}
}

Kode yang Dihasilkan:

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

Tangkapan layar

mmdemirbas
sumber
1
Seperti gambar Anda, ini menunjukkan kepada saya bahwa Anda dapat menggunakan variabel di dalamnya ${}dan, alih-alih ${cursor}, mengaktifkan "iterasi tab" di antara bidang. Terima kasih.
WesternGun
25

Untuk log, sedikit lagu pendek untuk menambahkan variabel anggota.

private static Log log = LogFactory.getLog(${enclosing_type}.class);
cgp
sumber
Untuk menulis ke file log secara manual: $ {: import (java.io.PrintWriter, java.io.BufferedWriter, java.io.FileWriter)} coba {PrintWriter out = PrintWriter baru (BufferedWriter baru (FileWriter baru ($ File loger: var (String)}, true))); out.println ($ {logLine: var (String)} $ {cursor}); out.close (); } catch (IOException e) {/ * TODO: penanganan exception * / e.printStackTrace (); }
Jack Miller
24

Buat tiruan dengan Mockito (dalam konteks "Pernyataan Java"):

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

Dan di "anggota tipe Java":

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

Mock metode void untuk melempar pengecualian:

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

Mock metode kosong untuk melakukan sesuatu:

${: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});

Verifikasi metode mocked yang dipanggil tepat sekali:

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

Verifikasi metode mocked tidak pernah dipanggil:

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

Daftar tertaut baru menggunakan Google Guava (dan serupa untuk hashset dan hashmap):

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

Saya juga menggunakan templat besar yang menghasilkan kelas Tes. Ini adalah bagian singkat yang harus disesuaikan oleh semua orang yang tertarik:

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
mantrid
sumber
1
Saya ingin tahu: mengapa Anda perlu mengejek para penebang?
Vladimir Sizikov
6
Anda dapat memverifikasi logger mocked disebut dalam kasus pengecualian tertangkap (skenario kegagalan). itu terutama berguna jika Anda tidak bermaksud untuk mengubah kembali tetapi ingin menegaskan itu tidak diabaikan secara diam-diam.
mantrid
23

Cek kosong!

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

if( ${word_selection} == null ){
    ${cursor}
}
Prashant Bhate
sumber
The PreConditions.checkNotNull(...)metode dalam Jambu adalah alternatif yang sangat mudah dibaca (terutama dengan impor statis)
Thorbjørn Ravn Andersen
Merupakan praktik terbaik untuk memeriksa nol (== null) terlebih dahulu sebelum memeriksa bukan nol.
KrishPrabakar
21

Salah satu yang saya cintai adalah foreach :

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

Dan penelusuran , karena saya sering menggunakannya untuk melacak:

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

Saya hanya berpikir tentang yang lain dan telah menemukannya di Internet suatu hari, const :

private static final ${type} ${name} = new ${type} ${cursor};
Artem Barger
sumber
11
foreach tersedia sebagai bantuan kode standar di Eclipse, saya tidak melihat bahwa templat Anda melakukan apa pun tambahan untuk versi standar
Penjual Kaya
4
Benar, dan sysout adalah template yang sangat inovatif. Pertanyaannya adalah mengenai, template berguna yang kami gunakan.
Artem Barger
4
Anda traceoutsudah tersedia di Eclipse as systrace.
dogbane
7
Bagus, saya ingin percaya ini muncul sekarang di Eclipse karena pertanyaan ini.
Artem Barger
const tersedia sebagai kode standar assist sebagai static_final (tidak yakin kapan ditambahkan)
Armand
20

Sedikit tip tentang sysout - Saya suka menamainya menjadi "sop". Tidak ada yang lain di lib java dimulai dengan "sop" sehingga Anda dapat dengan cepat mengetik "sop" dan boom, itu menyisipkan.

Scott Stanchfield
sumber
11
Secara default, hanya mengetikkan Syso akan melakukan hal yang sama seperti sysout.
MasterScrat
9
Kalahkan kamu sebesar 25% dengan sop, meskipun ...;)
Scott Stanchfield
2
Karena Eclipse Mars ada langkah buruk ke belakang pada pintasan "syso" + Ctrl + Spasi : ia akan mendaftar beberapa kelas yang memiliki karakter s, y, s dan o dalam namanya (karena penemuan CamelCase baru). Jadi, sekarang Anda juga harus memilih sysout dari daftar dan tekan Return.
bobbel
17

Lempar IllegalArgumentException dengan variabel dalam lingkup saat ini (illarg):

throw new IllegalArgumentException(${var});

Lebih baik

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

Tidak ada yang mewah untuk produksi kode - tetapi cukup berguna untuk ulasan kode

Saya memiliki template coderev saya rendah / med / tinggi melakukan hal berikut

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

Dan kemudian dalam tampilan Tugas - akan menunjukkan kepada saya semua komentar ulasan kode yang ingin saya sampaikan selama rapat.

ist_lion
sumber
14

Beberapa templat lagi di sini .

Termasuk:

  • Buat objek tanggal dari tanggal tertentu
  • Buat ArrayList generik baru
  • Pengaturan logger
  • Log dengan level yang ditentukan
  • Buat HashMap generik baru
  • Iterasi melalui peta, cetak kunci dan nilai-nilai
  • Pisahkan waktu menggunakan SimpleDateFormat
  • Baca file baris demi baris
  • Log dan rethrow pengecualian yang tertangkap
  • Cetak waktu eksekusi satu blok kode
  • Buat Timer berkala
  • Tulis string ke file
lrussell
sumber
menambahkan tautan mesin
wayback
12

slf4j Logging

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

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

Properti Kacang

private ${Type} ${property};

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

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

Dukungan PropertiChange

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);
}
kualidafial
sumber
10

Post Java 7, cara yang bagus untuk mengatur logger yang membutuhkan (atau lebih suka) referensi statis ke kelas terlampir adalah dengan menggunakan API MethodHandles yang baru diperkenalkan untuk mendapatkan kelas runtime dalam konteks statis.

Cuplikan contoh untuk SLF4J adalah:

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

Selain menjadi potongan sederhana dalam IDE apa pun, juga kurang rapuh jika Anda mengubah fungsi tertentu ke kelas lain karena Anda tidak akan sengaja membawa nama kelas dengannya.

Timothy055
sumber
9

Meminta kode pada utas GUI

Saya mengikat templat berikut ke pintasan slateruntuk dengan cepat mengirimkan kode pada utas GUI.

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

Saat menguji sekitar dengan kode saya kadang-kadang terjawab di menghapus beberapa syso s. Jadi saya membuat sendiri template yang disebut syt .

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

Sebelum saya kompilasi saya selalu memeriksa TODO saya dan tidak akan pernah lupa untuk menghapus System.out lagi.

Calon
sumber
9

strf -> String.format("msg", args) cukup sederhana tetapi menghemat sedikit mengetik.

String.format("${cursor}",)
pjp
sumber
6
Saya menggunakan String.format("${string}",${objects})karena Eclipse memungkinkan saya untuk tab di antara string saya dan daftar objek saya.
Duncan Jones
Saya menggunakan versi ini:, String.format(${word_selection}${},)${cursor}pertama pilih sebuah string kemudian gunakan 'sf' di atasnya. Tambahkan% s dan seterusnya ...
Christophe Roussy
8

Dapatkan warna SWT dari tampilan saat ini:

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

Suround dengan syncexec

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

Gunakan pola desain tunggal:

/**
 * 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;
}
Manuel Selva
sumber
3
Hanya catatan singkat - Menurut Maestro yang dikenal sebagai Joshua Bloch menggunakan Enum harus menjadi metode yang disukai untuk membuat lajang di Jawa.
Pablojim
Hai Pablojim, Karena saya memposting templat ini, saya mulai membaca Java Efektif dan saya mengubah implementasi lajang saya menjadi enum. Namun demikian saya tidak menemukan cara untuk membuat templat menghasilkan enum dan karenanya memodifikasi deklarasi kelas. Sudahkah Anda mendapatkan templat ini? Terima kasih Manu
Manuel Selva
FYI: Inilah pola enum singleton electrotek.wordpress.com/2008/08/06/… . Khususnya saya tidak suka tapi kemudian saya tidak punya banyak lajang. Sangat mudah untuk mengubahnya menjadi templat Java.
pjp
1
Untuk pendekatan enum, saya harap semua lajang Anda masuk akal sebagai objek yang sebanding, Serializable, karena banyak lajang tidak (dan ia bertanya-tanya mengapa ini "... pendekatan belum diadopsi secara luas" - karena perbandingan dan serialisasi tidak masuk akal untuk beberapa kelas tunggal!)
MetroidFan2002
Serializable? Iya. Pertimbangkan serialisasi Obyek dengan referensi ke Singleton Anda. Jika tidak Serializable, maka Anda mungkin menemukan NPE. Jika ya (dan Anda tidak menambahkan metode untuk menimpa de-serialisasi default), maka Anda mungkin mendapatkan contoh lain dari "Singleton" Anda.
Johannes Kuhn
8

Dan equalsbuilder, adaptasi 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);
}
Jon
sumber
Untuk solusi tanpa refleksi lihat jawaban saya di bawah ini tautan
gswierczynski
8

Template untuk deklarasi logger sangat bagus.

Saya juga membuat linfo, ldebug, lwarn, lerror untuk level log yang saya gunakan lebih sering.

lerror:

logger.error(${word_selection}${});${cursor}
fgui
sumber
8

Buat semuanya untuk sebuah acara

Karena acara agak merepotkan untuk dibuat di Jawa - semua antarmuka, metode, dan hal-hal untuk ditulis hanya untuk 1 acara - saya membuat template sederhana untuk membuat semua yang diperlukan untuk 1 acara.

${: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);
    }
}

Jika Anda memiliki acara yang membagikan satu EventObject, cukup hapus satu yang disesuaikan yang disisipkan oleh templat dan ubah bagian yang sesuai dari raise___()danon____() .

Saya telah menulis mekanisme acara yang bagus, sedikit, elegan menggunakan antarmuka generik dan kelas generik, tetapi tidak akan berhasil karena cara Java menangani obat generik. = (

Sunting : 1) Saya mengalami masalah ketika utas menambah / menghapus pendengar saat acara sedang berlangsung. Tidak Listdapat dimodifikasi saat sedang digunakan, jadi saya menambahkan synchronizedblok di mana daftar pendengar sedang diakses atau digunakan, mengunci daftar itu sendiri.

Benny Jobigan
sumber
Mengirim acara ketika sedang terkunci (disinkronkan atau sebaliknya) adalah jalan buntu yang menunggu untuk terjadi. Dalam hal ini akan lebih baik untuk menyalin pendengar saat berada di blok yang disinkronkan dan iterasi daftar baru.
ssindelar
Gunakan ConcurrentLinkedQueue . Tidak memerlukan penguncian, karena memiliki iterator yang lemah konsisten, yang tidak pernah melempar ConcurrentModificationException.
Stefan Dollase
8

Masukkan metode uji yang harus diberikan-kapan-kemudian

Saya melihat versi yang mirip dengan yang satu ini baru-baru ini ketika memasangkan pemrograman dengan pengembang dan teman yang sangat baik, dan saya pikir ini bisa menjadi tambahan yang bagus untuk daftar ini.

Templat ini akan membuat metode pengujian baru di kelas, mengikuti pendekatan Diberikan - Kapan - Kemudian dari pengembangan yang didorong perilaku (BDD) pada komentar, sebagai panduan untuk menyusun kode. Ini akan memulai nama metode dengan "harus" dan membiarkan Anda mengganti sisa nama metode dummy "CheckThisAndThat" dengan deskripsi terbaik dari tanggung jawab metode pengujian. Setelah mengisi nama, TAB akan membawa Anda langsung ke// Given section , sehingga Anda dapat mulai mengetik prasyarat Anda.

Saya memetakannya ke tiga huruf "tst", dengan deskripsi "Metode pengujian harus-diberikan-kapan-kemudian";)

Saya harap Anda merasakan manfaatnya seperti ketika saya melihatnya:

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

    // When


    // Then

}${:import(org.junit.Test, org.junit.Assert)}
MacLuq
sumber
Saya suka template itu. Saya menambahkan "throws Exception" untuk lebih memudahkan kenyamanan pengujian.
Torsten
Saya suka paradigma BDD. Template yang sangat bagus untuk itu. Dan hanya sebuah catatan: teman dan pengembang Anda yang sangat baik hilang!
bobbel
7

Injeksi Musim Semi

Saya tahu ini agak terlambat untuk permainan, tapi ini yang saya gunakan untuk Spring Injection di kelas:

${: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};
}
Mike Clark
sumber
7

Berikut ini adalah konstruktor untuk kelas yang tidak bisa dipakai:

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

Ini untuk pengecualian khusus:

/**
 * ${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);
    }
}
David M. Coe
sumber
5

Saya suka komentar kelas yang dihasilkan seperti ini:

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

"Saya ..." segera mendorong pengembang untuk menggambarkan apa yang dilakukan kelas. Saya tampaknya memperbaiki masalah kelas tidak berdokumen.

Dan tentu saja $ Id $ adalah kata kunci CVS yang berguna.

skaffman
sumber
5

Saya sudah banyak menggunakan cuplikan ini, mencari null nilai dan string kosong.

Saya menggunakan "uji argumen" -templat sebagai kode pertama dalam metode saya untuk memeriksa argumen yang diterima.

testNullArgument

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

Anda mungkin ingin mengubah pesan pengecualian agar sesuai dengan standar perusahaan atau proyek Anda. Namun, saya merekomendasikan memiliki beberapa pesan yang menyertakan nama argumen yang menyinggung. Kalau tidak, penelepon metode Anda harus melihat dalam kode untuk memahami apa yang salah. (SEBUAHNullPointerException tanpa pesan menghasilkan pengecualian dengan pesan "null" yang tidak masuk akal).

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}");
}

Anda juga dapat menggunakan kembali templat pemeriksaan nol dari atas dan menerapkan cuplikan ini hanya untuk memeriksa string kosong. Anda kemudian akan menggunakan kedua templat untuk menghasilkan kode di atas.

Template di atas, bagaimanapun, memiliki masalah bahwa jika argumen in adalah final Anda harus mengubah kode yang dihasilkan beberapa (the ${varName} = ${varName}.trim() akan gagal).

Jika Anda menggunakan banyak argumen terakhir dan ingin memeriksa string kosong tetapi tidak harus memotongnya sebagai bagian dari kode Anda, Anda bisa menggunakan ini:

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

Saya juga membuat beberapa cuplikan untuk memeriksa variabel yang tidak dikirim sebagai argumen (perbedaan besar adalah tipe pengecualian, sekarang menjadi IllegalStateExceptiongantinya).

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}");
}

testArgument

Ini adalah template umum untuk menguji suatu variabel. Butuh beberapa tahun untuk benar-benar belajar menghargai yang ini, sekarang saya sering menggunakannya (dalam kombinasi dengan template di atas tentu saja!)

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

Anda memasukkan nama variabel atau kondisi yang mengembalikan nilai, diikuti oleh operan ("==", "<", ">" dll) dan nilai atau variabel lain dan jika tes gagal, kode yang dihasilkan akan melempar IllegalArgumentException.

Alasan klausa if sedikit rumit, dengan seluruh ekspresi dibungkus dengan "! ()" Adalah untuk memungkinkan untuk menggunakan kembali kondisi pengujian dalam pesan pengecualian.

Mungkin akan membingungkan kolega, tetapi hanya jika mereka harus melihat kode, yang mungkin tidak harus mereka lakukan jika Anda melemparkan pengecualian semacam ini ...

Berikut ini contoh dengan array:

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");
    }
}

Anda mendapatkan hasil ini dengan memanggil templat, mengetik "from.length" [TAB] "== to.length".

Hasilnya jauh lebih lucu daripada "ArrayIndexOutOfBoundsException" atau serupa dan mungkin benar-benar memberi pengguna Anda kesempatan untuk mencari tahu masalahnya.

Nikmati!

Erk
sumber
4

Saya menggunakan ini untuk MessageFormat (menggunakan Java 1.4). Dengan begitu saya yakin bahwa saya tidak memiliki rangkaian yang sulit untuk diekstraksi ketika melakukan internasionalisasi

i18n

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

Juga untuk logging:

catatan

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

Beberapa favorit saya adalah ...

1: Javadoc, untuk menyisipkan dokumen tentang metode menjadi metode injeksi objek Musim Semi.

 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: Jendela debug, untuk membuat FileOutputStream dan menulis konten buffer ke file. Digunakan ketika Anda ingin membandingkan buffer dengan run yang lalu (menggunakan BeyondCompare), atau jika Anda tidak dapat melihat konten buffer (melalui inspeksi) karena terlalu besar ...

java.io.FileOutputStream fos = new java.io.FileOutputStream( new java.io.File("c:\\x.x"));
fos.write(buffer.toString().getBytes());
fos.flush();
fos.close();
jeff porter
sumber