Yararlı Eclipse Java kod şablonları arama [kapalı]


517

Eclipse'de çeşitli Java kod şablonları oluşturabilirsiniz.

Pencere> Tercihler> Java> Editör> Şablonlar

Örneğin

sysout şu adrese genişletildi:

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

Bunu, sysoutardından şunu yazarak etkinleştirebilirsiniz .CTRL+SPACE

Şu anda hangi yararlı Java kodu şablonlarını kullanıyorsunuz? Adını ve açıklamasını ve neden harika olduğunu ekleyin.

Yerleşik mevcut bir özellikten ziyade bir şablonun orijinal / yeni bir kullanımını arıyorum.

  • Log4J logger oluştur
  • Ekrandan SWT rengi alın
  • Syncexec - Eclipse Çerçevesi
  • Singleton Kalıbı / Enum Singleton Üretimi
  • Readfile
  • İnş
  • Traceout
  • Dizeyi Biçimlendir
  • Yorum Kodu İncelemesi
  • Dize biçimi
  • Sonunda Kilitlemeyi Deneyin
  • Mesaj Biçimi i18n ve günlük
  • Equalsbuilder
  • Hashcodebuilder
  • Bahar Nesnesi Enjeksiyonu
  • FileOutputStream Oluştur

5
Enum'dan olası tüm durumları içeren bir switch deyimi üreten herhangi bir var mı? Bunu CTRL + 1 ile yapabileceğinizi biliyorum, ancak cmd tamamlamasını kullanmayı tercih ederim.
GreenKiwi

4
Ne System.out.println(${word_selection}${});${cursor}anlama geldiğini açıklayabilir misiniz ? Bir kelimeyi seçmenin ve otomatik olarak bir sysoutaramanın içine yerleştirmenin bir yolu var gibi görünüyor , değil mi? Nasıl?
CodyBugstein

3
sysout çağrısı ile çevrili istediğiniz sözcüğü vurgulayın ve Ctrl-Space tuşuna basın (daha sonra çok sayıda vurgu farkında şablonunuz varsa şablonun adını yazın)
JReader

@JReader $ {} ne yapıyor?
Roland

Yanıtlar:


423

Aşağıdaki kod şablonları hem bir günlükçü oluşturur hem de gerekirse doğru içe aktarımları oluşturur.

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

Kaynak .

Temmuz

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

31
Güzel. $ {: İmport ...} şeyini bilmiyordum.
JesperE

3
Bence $ {: import ...} sadece Eclipse'in daha yeni sürümlerinde çalışıyor. 3.2 ile sıkıştım ve benim için çalışmıyor.
Adam Crume

Benim versiyonumda da değil (3.5). Hangi sürümün tanıtıldığını bilen var mı?
finnw

5
Onu seviyorum! Ancak $ {import ...} 'ı Logger bildiriminin altına koydum, böylece yeni bir satır eklemiyor.
Dario Seidl

1
@TMS - eklendi, teşekkürler!
Robert Munteanu

49

Bazı ek şablonlar: Link I - Link II

Bunu beğendim:

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} 

GÜNCELLEME : Bu şablonun Java 7 sürümü:

${: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
bence bu bir yöntemin ne olduğunu :)
benmmurphy

3
Bence bu noktayı kaçırdınız ... aslında ne demek istediğini bilmediğimi söyleyerek ... bu kod üretimi modülerlik değil ...
Jon

20
Bence bir şablonda bu kadar kod eklemek çok yaygın bir durum için kesme ve yapıştırma programlama olduğunu düşünüyorum.
Scott McIntyre

5
Evet, kod bloklarını yapıştırmak yerine bir dosyayı okumak için bir yardımcı program yöntemi kullanmalısınız. Kendiniz bir yöntem yazın veya Apache commons-io IOUtils kullanın. Yine de, farklı sınıf yollarıyla çok sayıda atma projesi yaparsanız, sadece bir dosyayı okumak için yardımcı program sınıfınıza bir JAR veya bağlantı eklemek acı verici olabilir. Bazen sadece bir dosyayı okuyan bir atma kodu yazmanız ve hayatınıza devam etmeniz gerekir.
Mike Clark

1
Java 7'de, tercih StandardCharsets.UTF_8üzerinde Charset.forName("UTF-8").
Mike Clark

33

Bir dizeyi biçimlendirme

MessageFormat - seçimi bir MessageFormat ile çevreleyin.

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

Bu, bir imleci bir dizeye taşımamı, seçimi tüm dizgiye (Shift-Alt-Up), ardından Ctrl-Space'i iki kez genişletmemi sağlar.

Seçimi kilitle

kilitle - seçili çizgileri son olarak kilitlemeyi deneyin. Bir kilit değişkeninin varlığını varsayalım.

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

NB ${line_selection}şablonları Surround With menüsünde (Alt-Shift-Z) görünür.


Bunu günlük ifadeleriyle birlikte kullanıyorum: logger.info (MessageFormat.format ($ {word_selection}, $ {imleç});
Pierre Henry

Kilit alınıyor ve serbest bırakmaya yönelik yöntemler denir lockve unlock. acquireve releasesemaforlar için kullanılır ve bir try-finally bloğu içinde kullanımları kilitlerde olduğu kadar kuvvetle tavsiye edilmez .
Marco Lackovic

Ctrl + Space iki kez artık çalışmıyor gibi görünüyor, SWT şablonları getiriyor. Bir yedek var mı?
Noumenon

28

Ölü bir yazı tekmelediğimi biliyorum, ancak bunu tamamlama uğruna paylaşmak istedim:

Kusurlu çift kontrollu kilitleme tasarımının üstesinden gelen tekli nesil şablonun doğru bir versiyonu (yukarıda tartışılmış ve başka yerde belirtilmiştir)

Singleton Oluşturma Şablonu: Bunu adlandırıncreatesingleton

static enum Singleton {
    INSTANCE;

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

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


Yukarıdakiler kullanılarak oluşturulan tek tonlara erişmek için:

Singleton referans Şablonu: Bunu adlandırın getsingleton:

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

4
Ölü değil, topluluk wiki'si, bu yüzden bulduğunuzda daha fazla şablon eklemek mantıklı. Bunların başka bir yerde gerçekten kapsamlı bir seti yok ...
Jon

Jon, önceki yazı ile yazı arasındaki zaman farkı neredeyse 8 aydı, bu yüzden alıntı yapmak zorunda kaldı.
Yorumundan

Bunu bir sınıfın parçası olarak oluşturduğumda (bir sınıfta iç içe bir numaralandırma) sınıfın adını istediğim gibi alıyorum ${enclosing_type}?
Mr_and_Mrs_D

1
@Mr_and_Mrs_D, bence konu bu. Bu şablonu yerleştirdiğiniz sınıfın tek bir örneğini alırsınız. Şimdi tek yapmanız gereken, kapalı tip yapıcıları özel yapmak ve oldukça güvenli bir singleton jeneratörüne sahip olmak.
Mike Adler

Bir numaralandırma oluşturmak için bunu kullanmak istiyorsanız, ${primary_type_name}örnek:public enum ${primary_type_name} { INSTANCE; private ${return_type} ${name} = new ${return_type}(); public ${return_type} ${getName}(${}) { return ${name}; } ${cursor} }
Robert Smit

28

Üzerinde yineleme yapmak için kod snippet'i ekleyin Map.entrySet():

Şablon:

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

Oluşturulan Kod:

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

Ekran görüntüsü


1
Resminiz gibi, bana bir değişken kullanabileceğinizi ${}ve ${cursor}alanlar arasında "sekme yinelemesini" etkinleştirdiğini gösteriyor. Teşekkürler.
WesternGun

25

Için log, üye değişken eklemek için yararlı bir küçük ditty.

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

Bir günlük dosyasına el ile yazmak için: $ {: import (java.io.PrintWriter, java.io.BufferedWriter, java.io.FileWriter)} {PrintWriter out = new PrintWriter (new BufferedWriter (yeni FileWriter ($ {logFile: var (String)}, true))); out.println ($ {logLine: var (String)} $ {imleç}); out.close (); } catch (IOException e) {/ * YAPILACAKLAR: kural dışı durum işleme * / e.printStackTrace (); }
Jack Miller

24

Mockito ile bir alay oluşturun ("Java ifadeleri" bağlamında):

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

Ve "Java türü üyeler" de:

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

Bir istisna atmak için geçersiz bir yöntemle alay et:

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

Bir şey yapmak için geçersiz bir yöntemle alay et:

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

Saldırıya uğrayan yöntemi tam olarak bir kez doğrulayın:

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

Saldırıya uğrayan yöntemin hiçbir zaman çağrılmadığını doğrulayın:

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

Google Guava kullanan yeni bağlantılı liste (ve hashset ve hashmap için benzer):

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

Ayrıca bir Test sınıfı üreten büyük bir şablon kullanın. İlgilenen herkesin özelleştirmesi gereken kısaltılmış bir parçası:

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
Merak ediyorum: neden kaydediciyle alay etmelisin?
Vladimir Sizikov

6
bir istisna yakalanması durumunda alaycı kaydedicinin çağrıldığını doğrulayabilirsiniz (hata senaryosu). Bu, yeniden düşünmek istemiyorsanız, ancak sessizce göz ardı edilmediğini iddia etmek istiyorsanız, özellikle yararlıdır.
mantrid

23

Boş Kontroller!

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

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

PreConditions.checkNotNull(...)Guava yöntem (özellikle statik ithalat ile) bir çok okunabilir bir alternatiftir
Thorbjorn Ravn Andersen

Null olup olmadığını kontrol etmeden önce null (== null) değerini kontrol etmek en iyi uygulamadır.
KrishPrabakar

21

Sevdiklerimden biri foreach :

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

Ve traceout , bunu izleme için bir sürü kullanarak olduğumdan beri:

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

Ben sadece başka bir tane düşündüm ve bir gün internet üzerinden bulduk, const :

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

11
foreach Eclipse'de standart bir kod yardımcısı olarak mevcuttur, şablonunuzun standart sürüme ek bir şey yaptığını görmüyorum
Rich Seller

4
Doğru ve sysout çok yenilikçi bir şablon. Soru, kullandığımız faydalı şablonlarla ilgiliydi.
Artem Barger

4
senin traceoutkadar Eclipse zaten yer almaktadır systrace.
dogbane

7
Güzel, bu soru nedeniyle şimdi Eclipse'de göründüğüne inanmak istiyorum.
Artem Barger

const static_final olarak standart bir kod yardımcısı olarak kullanılabilir (ne zaman eklendiğinden emin değilim)
Armand

20

Sysout üzerinde küçük bir ipucu - Ben "sop" olarak yeniden adlandırmak istiyorum. Java libs başka hiçbir şey "sop" ile başlar, böylece hızla "sop" ve bom yazabilirsiniz, ekler.


11
Varsayılan olarak, yalnızca syso yazmak, sysout ile aynı şeyi yapar.
MasterScrat

9
Yine de sop ile% 25 yendi ...;)
Scott Stanchfield

2
Eclipse Mars olduğundan, "syso" + Ctrl + Space kısayolunda geriye doğru zayıf bir adım vardır: adlarında s, y, s ve o karakterlerine sahip bazı sınıfları listeleyecektir (yeni CamelCase bulma nedeniyle). Yani, şimdi listeden ek bir tane seçmeli ve Geri Dön düğmesine basmalısınız.
bobbel

17

Geçerli kapsamda değişken olan bir IllegalArgumentException istisnası (illarg):

throw new IllegalArgumentException(${var});

Daha iyi

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

14

Kod üretimi için fantezi bir şey yok - ancak kod incelemeleri için oldukça yararlı

Benim şablon coderev düşük / med / yüksek var aşağıdakileri yapmak

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

Ve sonra Görevler görünümünde - bir toplantı sırasında getirmek istediğim tüm kod inceleme yorumlarını göstereceğim.


14

Burada biraz daha şablon var .

İçerir:

  • Belirli bir tarihten bir tarih nesnesi oluşturma
  • Yeni bir genel ArrayList oluşturun
  • Kaydedici kurulumu
  • Belirtilen seviyeye sahip günlük
  • Yeni bir genel HashMap oluşturma
  • Bir harita üzerinden yineleme yapın, anahtarları ve değerleri yazdırın
  • SimpleDateFormat kullanarak bir zamanı ayrıştırın
  • Dosyayı satır satır okuma
  • Yakalanan bir muafiyeti günlüğe kaydet ve yeniden
  • Bir kod bloğunun yürütme süresini yazdır
  • Periyodik Zamanlayıcı Oluştur
  • Dosyaya Dize Yazma

wayback makinesi bağlantısı eklendi
berezovskyi

12

slf4j Günlüğe Kaydetme

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

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

10

Fasulye Özelliği

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

Java 7'den sonra, çevreleme sınıfına statik başvuru gerektiren (veya tercih eden) günlükçüler oluşturmanın harika bir yolu, çalışma zamanı sınıfını statik bir bağlamda elde etmek için yeni tanıtılan MethodHandles API'sini kullanmaktır.

SLF4J için örnek bir pasaj:

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

Herhangi bir IDE'de basit bir snippet olmasının yanı sıra, belirli işlevselliği başka bir sınıfa yeniden yansıtmanız da daha az kırılgandır, çünkü sınıf adını yanlışlıkla onunla taşımazsınız.


9

GUI iş parçacığında kodu çağır

slaterGUI iş parçacığında kodu hızla göndermek için aşağıdaki şablonu kısayola bağlarım.

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

9

Kod ile test ederken bazen bazı syso s silmek için kaçırmış . Bu yüzden kendime syt adlı bir şablon yaptım .

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

Derlemeden önce her zaman TODO'larımı kontrol ediyorum ve bir System.out dosyasını tekrar silmeyi asla unutmayacağım.


9

strf -> String.format("msg", args) oldukça basit ama yazarak biraz tasarruf sağlar.

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

6
String.format("${string}",${objects})Eclipse benim dize ve nesne listem arasında sekme sağlar çünkü kullanın .
Duncan Jones

Ben bu sürümü kullanın: String.format(${word_selection}${},)${cursor}ilk önce bir dize seçin sonra 'sf' kullanın. % S ve benzerlerini ekleyin ...
Christophe Roussy

8

Mevcut ekrandan bir SWT rengi elde edin:

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

Syncexec özellikli ortam

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

Singleton tasarım desenini kullanın:

/**
 * 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
Sadece hızlı bir not - Joshua Bloch olarak bilinen Maestro'ya göre bir Enum kullanarak Java'da tektonlar oluşturmak için tercih edilen yöntem olmalıdır.
Pablojim

Merhaba Pablojim, Bu şablonu yayınladığımdan beri Etkili Java'yı okumaya başladım ve singleton uygulamalarımı enum olarak değiştirdim. Bununla birlikte, şablonun enum üreten ve böylece sınıf bildirimini değiştirmek için bir yol bulamadım. Bu şablonu aldınız mı? Teşekkürler Manu
Manuel Selva

Bilginize: İşte enum singleton modeli electrotek.wordpress.com/2008/08/06/… . Özellikle hoşlanmıyorum ama sonra pek çok tekliğim yok. Bunu bir Java şablonuna dönüştürmek kolaydır.
pjp

1
Enum yaklaşımı için, tüm singletonlarınızın Karşılaştırılabilir, Serializable nesneler olarak mantıklı olduğunu umuyorum, çünkü pek çok Singleton bunu yapmıyor (ve bu "... yaklaşımının henüz yaygın olarak kabul edilmediğini" merak ediyor - çünkü karşılaştırılabilirlik ve serileştirme yok bazı singleton sınıfları için mantıklı değil!)
MetroidFan2002

Serileştirilebilir? Evet. Singleton referansınız ile bir Nesnenin serileştirilmesini düşünün. Serializable değilse, bir NPE ile karşılaşabilirsiniz. Öyleyse (ve varsayılan serileştirmenin üzerine yazmak için yöntem eklemezseniz), "Singleton" unuzun başka bir örneğini alabilirsiniz.
Johannes Kuhn

8

Ve bir eşit oluşturucu, hashcodebuilder uyarlaması:

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

Yansımasız bir çözüm için aşağıdaki cevabım linkine
gswierczynski

8

Kaydedici beyanı şablonu harika.

Ayrıca daha sık kullandığım günlük düzeyleri için linfo, ldebug, lwarn, lerror oluşturuyorum.

lerror:

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

8

Bir etkinlik için her şeyi oluşturun

Olaylar Java'da yaratmak için bir acı olduğundan - sadece 1 olay için yazmak için tüm bu arayüzler, yöntemler ve şeyler - 1 olay için gereken her şeyi oluşturmak için basit bir şablon yaptım.

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

Tek bir paylaşan etkinlikleriniz varsa EventObject, sadece şablon tarafından eklenen özelleştirilmiş birini silin ve uygun bölümlerini değiştirmek raise___()ve on____().

Genel bir arayüz ve genel sınıf kullanarak güzel, küçük, zarif bir olay mekanizması yazmıştım, ancak Java'nın jenerikleri işleme biçimi nedeniyle işe yaramazdı. = (

Düzenleme : 1) Ben bir olay gerçekleşirken iş parçacığı ekleyerek / dinleyici kaldırma sorunu içine koştu. Kullanım Listsırasında değiştirilemez, bu yüzden synchronizeddinleyicilerin listesine erişildiği veya kullanıldığı blokları listeye kilitledim.


Kilitteyken (senkronize veya başka türlü) olay göndermek, gerçekleşmeyi bekleyen bir kilitlenmedir. Bu durumda, senkronize edilmiş bir bloktayken ve yeni listeyi tekrarlarken dinleyicileri kopyalamak daha iyi olur.
ssindelar

Bir ConcurrentLinkedQueue kullanın . Kilitleme gerektirmez, çünkü asla ConcurrentModificationException özel durumu oluşturmayan zayıf tutarlı bir yineleyiciye sahiptir.
Stefan Dollase

8

Insert test yöntemleri ne zaman verilmelidir

Çok iyi bir geliştirici ve arkadaş ile çift programlama yaparken son zamanlarda buna benzer bir sürüm gördüm ve bence bu listeye güzel bir ek olabilir.

Bu şablon , kodun yapılandırılması için bir kılavuz olarak, yorumlardaki davranış odaklı geliştirme (BDD) paradigmasından verilen - Ne Zaman - Sonra yaklaşımını izleyerek sınıfta yeni bir test yöntemi oluşturur . Yöntem adını "must" ile başlatacak ve "CheckThisAndThat" kukla yöntem adının geri kalanını test yöntemi sorumluluğunun mümkün olan en iyi açıklamasıyla değiştirmenize izin verecektir. Adı doldurduktan sonra, SEKME sizi doğrudan adresine götürür , böylece ön koşullarınızı yazmaya başlayabilirsiniz.// Given section

Ben üç "tst", "Test yöntemleri-zaman-sonra-gerekir";) açıklaması ile eşleştirilmiş var;)

Umarım gördüğümde yaptığım kadar faydalı bulursunuz:

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

    // When


    // Then

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

Bu şablonu seviyorum. Test konforunu biraz daha kolaylaştırmak için bir "istisna atar" ekledim.
Torsten

BDD paradigmasını seviyorum. Bunun için çok güzel bir şablon. Ve sadece bir not: çok iyi geliştirici ve arkadaşınız gitti!
bobbel

7

Yay Enjeksiyonu

Bunun oyunun biraz geç olduğunu biliyorum, ama burada bir sınıfta Bahar Enjeksiyonu için kullandığım bir şey:

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

İşte somut olmayan sınıflar için bir kurucu:

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

Bu özel istisnalar içindir:

/**
 * ${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

Ben böyle bir oluşturulan sınıf yorumu gibi:

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

"Ben ..." derhal geliştiriciyi sınıfın ne yaptığını anlatmaya teşvik eder. Belgelenmemiş sınıflar sorununu iyileştiriyor gibi görünüyorum.

Ve elbette $ Id $ yararlı bir CVS anahtar kelimesidir.


5

Bu snippet'leri çok fazla kullandım, nulldeğerler ve boş dizeler arıyorum .

Alınan argümanları kontrol etmek için yöntemlerimdeki ilk kod olarak "argüman test" -templates kullanıyorum.

testNullArgument

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

İstisna mesajını şirketinizin veya projenizin standardına uyacak şekilde değiştirmek isteyebilirsiniz. Ancak, rahatsız edici argümanın adını içeren bir mesaj almanızı öneririm. Aksi takdirde, yönteminizin arayanı neyin yanlış gittiğini anlamak için koda bakmalıdır. ( NullPointerExceptionİletisi olmayan A , oldukça saçma "null" iletisiyle bir istisna oluşturur).

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

Ayrıca boş denetim şablonunu yukarıdan tekrar kullanabilir ve bu parçacığı yalnızca boş dizeleri denetlemek için uygulayabilirsiniz. Daha sonra yukarıdaki kodu üretmek için bu iki şablonu kullanırsınız.

Bununla birlikte, yukarıdaki şablonda, argümanda son ise, üretilen kodu bazılarını değiştirmeniz ${varName} = ${varName}.trim()gerekecektir (başarısız olacaktır).

Çok sayıda son argüman kullanıyorsanız ve boş dizeleri kontrol etmek istiyorsanız, ancak bunları kodunuzun bir parçası olarak kırpmanız gerekmiyorsa, bununla devam edebilirsiniz:

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

Ayrıca, bağımsız değişken olarak gönderilmeyen değişkenleri kontrol etmek için bazı snippet'ler oluşturdum (büyük fark, istisna tipidir, şimdi IllegalStateExceptionbunun yerine).

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

Bu, bir değişkeni test etmek için genel bir şablondur. Bunu takdir etmeyi öğrenmek birkaç yılımı aldı, şimdi çok kullanıyorum (elbette yukarıdaki şablonlarla birlikte!)

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

Bir değişken adı veya değer döndüren bir koşulu, ardından bir işlenen ("==", "<", ">" vb.) Ve başka bir değer veya değişken girersiniz ve sınama başarısız olursa, sonuçta ortaya çıkan kod bir IllegalArgumentException oluşturur.

Tüm ifadenin bir "! ()" İçine sarılmasıyla biraz karmaşık if yantümcesinin nedeni, istisna mesajındaki test koşulunun yeniden kullanılmasını mümkün kılmaktır.

Belki de bir meslektaşı karıştıracaktır, ancak sadece bu tür istisnaları atarsanız koda bakmayacakları koda bakmaları gerekiyorsa ...

İşte dizilerle ilgili bir örnek:

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

Bu sonucu, "from.length" [TAB] "== to.length" yazarak şablonu çağırarak elde edersiniz.

Sonuç, "ArrayIndexOutOfBoundsException" veya benzerlerinden çok daha komiktir ve kullanıcılarınıza sorunu çözme şansı verebilir.

Zevk almak!


4

MessageFormat (Java 1.4 kullanarak) için bunu kullanın. Bu şekilde, uluslararasılaşma yaparken elde edilmesi zor hiçbir birleşim olmadığından eminim

i18n

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

Ayrıca kayıt için:

günlük

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

4

En sevdiğim birkaç ...

1: Javadoc, Spring nesnesi enjeksiyon yöntemi olma yöntemiyle ilgili dokümanı eklemek için.

 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: Bir FileOutputStream oluşturmak ve arabellek içeriğini bir dosyaya yazmak için hata ayıklama penceresi. Bir arabelleği geçmiş bir çalışma ile karşılaştırmak istediğinizde (BeyondCompare kullanarak) veya çok büyük olduğundan bir arabellek içeriğini (denetleme yoluyla) görüntüleyemiyorsanız ...

java.io.FileOutputStream fos = new java.io.FileOutputStream( new java.io.File("c:\\x.x"));
fos.write(buffer.toString().getBytes());
fos.flush();
fos.close();
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.