การค้นหาเท็มเพลตโค้ด Eclipse Java ที่มีประโยชน์ [ปิด]


517

คุณสามารถสร้างเท็มเพลตโค้ด Java ต่างๆใน Eclipse ผ่าน

หน้าต่าง> ค่ากำหนด> Java> Editor> เทมเพลต

เช่น

sysout ถูกขยายเป็น:

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

คุณสามารถเปิดใช้งานได้โดยพิมพ์sysoutตามด้วยCTRL+SPACE

เท็มเพลตโค้ด Java ที่มีประโยชน์อะไรที่คุณใช้อยู่ในปัจจุบัน? รวมชื่อและคำอธิบายของมันและทำไมมันเจ๋ง

ฉันกำลังมองหาการใช้เทมเพลตต้นฉบับ / นวนิยายแทนที่จะเป็นฟีเจอร์ที่มีอยู่แล้วภายใน

  • สร้าง Logger Logger
  • รับสี swt จากจอแสดงผล
  • Syncexec - Eclipse Framework
  • รูปแบบซิงเกิล / Enum รูปแบบซิงเกิล
  • readfile
  • const
  • Traceout
  • รูปแบบสตริง
  • รีวิวรหัสความคิดเห็น
  • รูปแบบสตริง
  • ลองล็อคสุดท้าย
  • รูปแบบข้อความ i18n และบันทึก
  • Equalsbuilder
  • Hashcodebuilder
  • การฉีดสปริงวัตถุ
  • สร้าง FileOutputStream

5
มีผู้ใดบ้างที่สร้างคำสั่ง switch จาก Enum พร้อมกับเคสที่เป็นไปได้ทั้งหมด? ฉันรู้ว่าคุณสามารถทำได้ด้วย CTRL + 1 แต่ฉันอยากใช้ cmd ที่สมบูรณ์
GreenKiwi

4
คุณช่วยอธิบายความSystem.out.println(${word_selection}${});${cursor}หมายได้อย่างไร ดูเหมือนว่าจะมีวิธีในการเลือกคำและเข้ารหัสโดยอัตโนมัติในการsysoutโทรใช่ไหม? อย่างไร?
CodyBugstein

3
คุณเน้นคำที่คุณต้องการล้อมรอบด้วย sysout call แล้วกด Ctrl-Space (จากนั้นพิมพ์ชื่อของเทมเพลตหากคุณมีเทมเพลตที่เน้นจำนวนมากที่คุณสนใจ)
JReader

@JReader $ {} ทำหน้าที่อะไร
Roland

คำตอบ:


423

แม่แบบรหัสต่อไปนี้จะสร้าง logger และสร้างการนำเข้าที่ถูกต้องหากจำเป็น

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

แหล่ง

กรกฎาคม

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

31
เย็น. ฉันไม่รู้เกี่ยวกับ $ {: import ... } thingy
JesperE

3
ฉันคิดว่า $ {: นำเข้า ... } ใช้งานได้กับ Eclipse รุ่นใหม่กว่าเท่านั้น ฉันติดกับ 3.2 และมันไม่ได้ผลสำหรับฉัน
Adam Crume

ไม่ได้อยู่ในรุ่นของฉัน (3.5) เช่นกัน มีใครรู้บ้างว่าเป็นเวอร์ชั่นอะไร
finnw

5
ฉันรักมัน! แต่ฉันวาง $ {import ... } ไว้ด้านล่างการประกาศของ Logger เพื่อที่จะไม่เพิ่มบรรทัดใหม่
Dario Seidl

1
@TMS - เพิ่มแล้วขอบคุณ!
Robert Munteanu

49

เทมเพลตเพิ่มเติมบางส่วนที่นี่: ลิงก์ I - ลิงก์ II

ฉันชอบอันนี้:

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} 

อัปเดต : เทมเพลตนี้เวอร์ชัน Java 7 คือ:

${: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
ผมคิดว่านี่คือสิ่งที่เป็นวิธีการสำหรับ :)
benmmurphy

3
เอ่อผมคิดว่าคุณได้พลาดจุด ... บอกว่าที่จริงผมไม่ทราบว่าจุดของคุณคือ ... มันเป็นเรื่องของการสร้างรหัสไม่ได้ต้นแบบ ...
จอน

20
ฉันคิดว่าประเด็นคือการเพิ่มรหัสนี้ในเทมเพลตคือการเขียนโปรแกรมแบบตัดและวางสำหรับสถานการณ์ทั่วไป
Scott McIntyre

5
ใช่คุณควรใช้วิธีการยูทิลิตี้เพื่ออ่านไฟล์แทนการวางบล็อคของรหัส เขียนวิธีการด้วยตนเองหรือใช้ Apache Commons-io IOUtils ถึงกระนั้นถ้าคุณทำโปรเจ็กต์จำนวนมากที่มี classpaths ต่างกันอาจเป็นเรื่องยากที่จะเพิ่ม JAR หรือลิงค์ในคลาสยูทิลิตี้ของคุณเพื่ออ่านไฟล์ บางครั้งคุณเพียงแค่ต้องเขียนรหัสใบปลิวที่อ่านไฟล์และดำเนินชีวิตของคุณต่อไป
Mike Clark

1
ใน Java 7 ชอบมากกว่าStandardCharsets.UTF_8 Charset.forName("UTF-8")
Mike Clark

33

จัดรูปแบบสตริง

MessageFormat - ล้อมรอบส่วนที่เลือกด้วย MessageFormat

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

สิ่งนี้ทำให้ฉันเลื่อนเคอร์เซอร์ไปที่สตริงขยายการเลือกไปยังทั้งสตริง (Shift-Alt-Up) จากนั้นกด Ctrl-Space สองครั้ง

ล็อคส่วนที่เลือก

lock - ล้อมรอบเส้นที่เลือกด้วยการลองล็อคในที่สุด สมมติว่ามีตัวแปรล็อคอยู่

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

${line_selection}เทมเพลตNB แสดงขึ้นในเมนูSurround With (Alt-Shift-Z)


ฉันใช้สิ่งนี้ร่วมกับคำสั่งบันทึก: logger.info (MessageFormat.format ($ {word_selection}, $ {เคอร์เซอร์});
Pierre Henry

วิธีการในการซื้อและการปล่อยล็อคจะเรียกว่าและlock และจะใช้สำหรับสัญญาณและการใช้งานของพวกเขาภายในบล็อกลองในที่สุดก็ไม่ควรเป็นอย่างยิ่งเช่นเดียวกับล็อค unlockacquirerelease
Marco Lackovic

Ctrl + Space สองครั้งดูเหมือนจะไม่ทำงานอีกต่อไปแสดงแม่แบบ SWT มีการเปลี่ยนหรือไม่
Noumenon

28

ฉันรู้ว่าฉันกำลังเตะโพสต์ที่ตายแล้ว แต่ต้องการแบ่งปันสิ่งนี้เพราะเห็นว่าเสร็จ:

เทมเพลตการสร้างซิงเกิลเวอร์ชั่นที่ถูกต้องซึ่งเอาชนะการออกแบบล็อคที่มีการตรวจสอบซ้ำสองครั้ง (กล่าวถึงข้างต้นและที่อื่น ๆ )

เทมเพลตการสร้างเดี่ยว: ตั้ง ชื่อสิ่งนี้createsingleton

static enum Singleton {
    INSTANCE;

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

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


วิธีเข้าถึงซิงเกิลตันที่สร้างโดยใช้ด้านบน:

แม่แบบการอ้างอิงเดี่ยว: ชื่อนี้getsingleton:

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

4
มันยังไม่ตายมันเป็นวิกิชุมชนดังนั้นจึงเหมาะสมที่จะเพิ่มเทมเพลตเพิ่มเติมเมื่อคุณพบมัน ไม่มีชุดที่ครอบคลุมของสิ่งเหล่านี้ที่อื่นเลย ...
Jon

จอนเวลาว่างระหว่างการโพสต์ก่อนหน้าและโพสต์ของฉันเกือบ 8 เดือนนั่นคือสิ่งที่บังคับให้พูดอย่างนั้น ฉันไม่สามารถวลีมันได้ดีกว่าความคิดเห็นของคุณ :)
questzen

เมื่อฉันสร้างสิ่งนี้เป็นส่วนหนึ่งของคลาส (enum ซ้อนกันในชั้นเรียน) ฉันจะได้ชื่อของคลาสตามที่ ${enclosing_type}ต้องการ -
Mr_and_Mrs_D

1
@Mr_and_Mrs_D ฉันคิดว่านั่นเป็นประเด็น คุณได้รับอินสแตนซ์เดี่ยวของคลาสที่คุณใส่แม่แบบนี้ ตอนนี้สิ่งที่คุณต้องทำคือทำให้ตัวสร้างประเภทล้อมรอบเป็นส่วนตัวและมีเครื่องกำเนิดไฟฟ้าเดี่ยวที่ปลอดภัย
Mike Adler

หากคุณต้องการใช้สิ่งนี้เพื่อสร้าง${primary_type_name}ตัวอย่างการใช้ enum :public enum ${primary_type_name} { INSTANCE; private ${return_type} ${name} = new ${return_type}(); public ${return_type} ${getName}(${}) { return ${name}; } ${cursor} }
Robert Smit

28

ต่อท้ายโค้ดเพื่อวนซ้ำMap.entrySet():

แม่แบบ:

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

สร้างรหัส:

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

ภาพหน้าจอ


1
เช่นเดียวกับรูปของคุณมันแสดงให้ฉันเห็นว่าคุณสามารถใช้ตัวแปรใน${}และแทนที่จะ${cursor}เปิดใช้งาน "การวนซ้ำของแท็บ" ระหว่างฟิลด์ ขอบคุณ
WesternGun

25

สำหรับlogสิ่งเล็กน้อยที่เป็นประโยชน์เพื่อเพิ่มในตัวแปรสมาชิก

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

สำหรับการเขียนไปยังล็อกไฟล์ด้วยตนเอง: $ {: import (java.io.PrintWriter, java.io.BufferedWriter, java.io.FileWriter)} ลอง {PrintWriter out = new PrintWriter (New BufferedWriter ใหม่ ($ {logFile: var (String)}, true))); out.println ($ {logline: var (String)} $ {เคอร์เซอร์}); out.close (); } catch (IOException e) {/ * TODO: การจัดการข้อยกเว้น * / e.printStackTrace (); }
Jack Miller

24

สร้างการจำลองด้วย Mockito (ในบริบท "คำสั่ง Java"):

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

และใน "สมาชิกประเภท Java":

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

เยาะเย้ยเป็นโมฆะวิธีการโยนข้อยกเว้น:

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

เยาะเย้ยวิธีการที่จะทำให้บางสิ่งบางอย่าง:

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

ตรวจสอบวิธีการเยาะเย้ยที่เรียกว่าหนึ่งครั้ง:

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

ยืนยันว่าวิธีการเยาะเย้ยไม่เคยถูกเรียกใช้:

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

รายการที่เชื่อมโยงใหม่โดยใช้ Google Guava (และคล้ายกับ hashset และ hashmap):

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

ฉันยังใช้เทมเพลตขนาดใหญ่ที่สร้างคลาสการทดสอบ นี่คือส่วนสั้น ๆ ของมันที่ทุกคนที่สนใจควรปรับแต่ง:

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
ฉันอยากรู้: ทำไมคุณต้องล้อเลียนคนลอกเลียนแบบ?
Vladimir Sizikov

6
คุณสามารถตรวจสอบว่ามีการเรียกใช้ตัวลอกเลียนแบบในกรณีที่มีข้อผิดพลาดเกิดขึ้น (สถานการณ์สมมติล้มเหลว) นั่นมีประโยชน์โดยเฉพาะอย่างยิ่งถ้าคุณไม่ได้ตั้งใจที่จะ rethrow แต่ต้องการยืนยันว่ามันจะไม่ถูกเพิกเฉย
mantrid

23

ตรวจสอบ Null!

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

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

PreConditions.checkNotNull(...)วิธีการในฝรั่งเป็นทางเลือกที่สามารถอ่านได้มาก (โดยเฉพาะอย่างยิ่งกับการนำเข้าคงที่)
Thorbjørn Ravn Andersen

เป็นวิธีที่ดีที่สุดในการตรวจสอบ null (== null) ก่อนที่จะตรวจสอบว่าไม่ใช่ null
KrishPrabakar

21

ที่รักของฉันคนหนึ่งคือforeach :

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

และติดตามเนื่องจากฉันใช้มันมากสำหรับการติดตาม:

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

ฉันเพิ่งคิดเกี่ยวกับอีกคนหนึ่งและได้พบมันผ่านทางอินเทอร์เน็ตบางวันconst :

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

11
foreach มีให้ใช้งานเป็นรหัสมาตรฐานใน Eclipse ฉันไม่เห็นว่าแม่แบบของคุณทำอะไรเพิ่มเติมกับรุ่นมาตรฐาน
ผู้ขายที่รวย

4
ถูกต้องและ sysout เป็นแม่แบบที่เป็นนวัตกรรมมาก คำถามเกี่ยวกับแม่แบบที่มีประโยชน์ที่เราใช้
Artem Barger

4
คุณtraceoutมีอยู่แล้วใน Eclipse systraceเป็น
dogbane

7
ดีฉันต้องการเชื่อว่าตอนนี้ปรากฏใน Eclipse เนื่องจากคำถามนี้
Artem Barger

const มีให้บริการในฐานะผู้ช่วยรหัสมาตรฐานในรูปแบบ static_final (ไม่แน่ใจว่าเมื่อมันถูกเพิ่มเข้ามา)
Armand

20

เคล็ดลับเล็ก ๆ น้อย ๆ เกี่ยวกับ sysout - ฉันต้องการเปลี่ยนชื่อเป็น "sop" ไม่มีอะไรใน java libs ที่ขึ้นต้นด้วย "sop" เพื่อให้คุณสามารถพิมพ์ "sop" และ boom ได้อย่างรวดเร็ว


11
โดยค่าเริ่มต้นเพียงพิมพ์sysoจะทำเช่นเดียวกับ sysout
MasterScrat

9
เอาชนะยาโดย 25% ด้วย sop แม้ว่า ... ;)
Scott Stanchfield

2
เนื่องจาก Eclipse Mars มีขั้นตอนที่แย่ย้อนหลังบนทางลัด"syso" + Ctrl + Space : มันจะแสดงรายการคลาสที่มีอักขระ s, y, s และ o ในชื่อของพวกเขา (เนื่องจากการค้นหา CamelCase ใหม่) ดังนั้นตอนนี้คุณต้องเลือกsysoutเพิ่มเติมจากรายการและกด Return
bobbel

17

โยน IllegalArgumentException ด้วยตัวแปรในขอบเขตปัจจุบัน (illarg):

throw new IllegalArgumentException(${var});

ดีกว่า

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

14

ไม่มีอะไรแฟนซีสำหรับการผลิตรหัส - แต่ค่อนข้างมีประโยชน์สำหรับการตรวจสอบรหัส

ฉันมีแม่แบบ coderev ของฉันต่ำ / med / สูงทำดังต่อไปนี้

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

จากนั้นในมุมมองงาน - จะแสดงความคิดเห็นเกี่ยวกับรหัสทั้งหมดที่ฉันต้องการนำมาแสดงในระหว่างการประชุม


14

บางแม่มากขึ้นที่นี่

รวม:

  • สร้างวัตถุวันที่จากวันที่ที่เฉพาะเจาะจง
  • สร้าง ArrayList สามัญใหม่
  • การตั้งค่าคนตัดไม้
  • เข้าสู่ระบบด้วยระดับที่ระบุ
  • สร้าง HashMap ทั่วไปใหม่
  • วนซ้ำผ่านแผนที่พิมพ์ปุ่มและค่าต่างๆ
  • แยกเวลาโดยใช้ SimpleDateFormat
  • อ่านไฟล์ทีละบรรทัด
  • เข้าสู่ระบบและ rethrow exption ที่ถูกจับ
  • พิมพ์เวลาดำเนินการของบล็อกของรหัส
  • สร้างตัวจับเวลาเป็นระยะ
  • เขียน String ไปยังไฟล์

เพิ่มลิงก์เครื่อง wayback
berezovskyi


10

ทรัพย์สินถั่ว

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 วิธีที่ยอดเยี่ยมในการตั้งค่าตัวบันทึกที่ต้องการ (หรือต้องการ) การอ้างอิงแบบคงที่ไปยังคลาสที่ปิดล้อมคือการใช้ MethodHandles API ที่แนะนำใหม่เพื่อรับคลาสรันไทม์ในบริบทแบบสแตติก

ตัวอย่างโค้ดสำหรับ SLF4J คือ:

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

นอกเหนือจากการเป็นตัวอย่างข้อมูลง่ายๆใน IDE ใด ๆ มันยังเปราะน้อยกว่าหากคุณปรับการทำงานบางอย่างให้เป็นคลาสอื่นเนื่องจากคุณจะไม่นำชื่อคลาสไปด้วย


9

เรียกใช้รหัสบนเธรด GUI

ฉันผูกแม่แบบต่อไปนี้กับทางลัดslaterเพื่อส่งรหัสอย่างรวดเร็วบนเธรด GUI

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

9

เมื่อการทดสอบรอบกับรหัสบางครั้งฉันพลาดออกลบบางsyso s ดังนั้นฉันทำเองแม่แบบที่เรียกว่าSYT

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

ก่อนที่ฉันจะรวบรวมฉันจะตรวจสอบสิ่งที่ต้องทำของฉันและจะไม่มีวันลืมที่จะลบ System.out อีกครั้ง


9

strf -> String.format("msg", args) ค่อนข้างเรียบง่าย แต่ประหยัดการพิมพ์เล็กน้อย

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

6
ฉันใช้String.format("${string}",${objects})เพราะ Eclipse อนุญาตให้ฉันแท็บระหว่างสตริงของฉันและรายการวัตถุของฉัน
Duncan Jones

ฉันใช้รุ่นนี้: String.format(${word_selection}${},)${cursor}ก่อนอื่นเลือกสตริงจากนั้นใช้ 'sf' กับมัน เพิ่ม% s และอื่น ๆ ...
Christophe Roussy

8

รับสี SWT จากจอแสดงผลปัจจุบัน:

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

เพิ่มขึ้นด้วย syncexec

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

ใช้รูปแบบการออกแบบเดี่ยว:

/**
 * 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
เพียงบันทึกย่อ - ตามมาสโทรที่รู้จักกันในชื่อ Joshua Bloch โดยใช้ Enum ควรเป็นวิธีที่ต้องการสำหรับการสร้างซิงเกิลตันใน Java
Pablojim

สวัสดี Pablojim ตั้งแต่ฉันโพสต์เทมเพลตนี้ฉันเริ่มอ่านจาวาที่มีประสิทธิภาพและฉันเปลี่ยนการใช้งานแบบซิงเกิลเป็น enum อย่างไรก็ตามฉันไม่พบวิธีให้เทมเพลตสร้าง enum และแก้ไขการประกาศคลาส คุณมีเทมเพลตนี้หรือไม่ ขอบคุณมนู
Manuel Selva

FYI: นี่คือ enum เดี่ยวรูปแบบelectrotek.wordpress.com/2008/08/06/... ฉันไม่ชอบมันโดยเฉพาะ แต่แล้วฉันก็ไม่ได้มีซิงเกิลมากมาย เปลี่ยนเป็นเทมเพลต Java ได้ง่าย
pjp

1
สำหรับวิธีการ enum ฉันหวังว่าซิงเกิลทั้งหมดของคุณจะเปรียบเทียบได้ว่าเป็นวัตถุที่สามารถเปรียบเทียบได้เนื่องจาก Serialton จำนวนมากไม่ (และเขาสงสัยว่าทำไม "... วิธีการยังไม่ได้รับการยอมรับอย่างกว้างขวาง" - เพราะการเปรียบเทียบและซีเรียลดอน ไม่สมเหตุสมผลสำหรับคลาสซิงเกิล!)
MetroidFan2002

Serializable? ใช่. พิจารณาการทำให้เป็นอันดับของวัตถุที่มีการอ้างอิงถึงซิงเกิลของคุณ หากไม่ใช่ Serializable คุณอาจพบ NPE หากเป็น (และคุณไม่ได้เพิ่มวิธีการเขียนทับการยกเลิกการทำให้เป็นอนุกรม) คุณอาจได้รับอินสแตนซ์อื่นของ "Singleton" ของคุณ
โยฮันน์คุห์น

8

และผู้สร้าง Equalsbuilder, hashcodebuilder adaptation:

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

สำหรับวิธีการแก้ปัญหาที่ไม่มีการสะท้อนโปรดดูคำตอบของฉันลิงค์
gswierczynski

8

เทมเพลตสำหรับการประกาศตัวบันทึกนั้นยอดเยี่ยมมาก

ฉันยังสร้าง linfo, ldebug, lwarn, lerror สำหรับระดับการบันทึกที่ฉันใช้บ่อยขึ้น

lerror:

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

8

สร้างทุกอย่างสำหรับเหตุการณ์

เนื่องจากเหตุการณ์เป็นสิ่งที่เจ็บปวดในการสร้างใน Java - อินเตอร์เฟสวิธีการและสิ่งที่ต้องเขียนทั้งหมดสำหรับ 1 เหตุการณ์ - ฉันสร้างเทมเพลตอย่างง่ายเพื่อสร้างทุกสิ่งที่จำเป็นสำหรับ 1 เหตุการณ์

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

ถ้าคุณมีกิจกรรมที่ร่วมกันเป็นหนึ่งเดียวEventObjectเพียงลบหนึ่งที่กำหนดเองเขียนโดยแม่แบบและเปลี่ยนชิ้นส่วนที่เหมาะสมและraise___()on____()

ฉันได้เขียนกลไกการจัดอีเวนท์ที่ดีและสง่างามโดยใช้อินเตอร์เฟสทั่วไปและคลาสทั่วไป แต่มันก็ไม่ได้ผลเนื่องจากวิธีที่จาวาจัดการกับข้อมูลทั่วไป = (

แก้ไข : 1) ฉันพบปัญหาที่มีการเพิ่ม / ลบเธรดในขณะที่มีการจัดกิจกรรม Listไม่สามารถแก้ไขได้ในขณะที่ในการใช้งานดังนั้นฉันเพิ่มsynchronizedบล็อกที่รายชื่อของผู้ฟังจะถูกเข้าถึงหรือใช้ล็อคอยู่ในรายชื่อของตัวเอง


การส่งเหตุการณ์ขณะอยู่ในล็อค (ซิงโครไนซ์หรืออื่น ๆ ) เป็นการหยุดชะงักที่รอให้เกิดขึ้น ในกรณีนี้จะเป็นการดีกว่าถ้าคัดลอกตัวรับฟังขณะอยู่ในบล็อกที่ซิงโครไนซ์และวนซ้ำรายการใหม่
ssindelar

ใช้ConcurrentLinkedQueue มันไม่จำเป็นต้องล็อคเพราะมันมีตัววนซ้ำที่สอดคล้องกันอย่างอ่อนซึ่งไม่เคยโยน ConcurrentModificationException
Stefan Dollase

8

วิธีการทดสอบแบบแทรกควรได้รับเมื่อ - ในตอนนั้น

ฉันเห็นรุ่นที่คล้ายกันกับรุ่นนี้เมื่อไม่นานมานี้ในขณะที่จับคู่การเขียนโปรแกรมกับนักพัฒนาและเพื่อนที่ดีมากและฉันคิดว่ามันน่าจะเป็นส่วนเสริมที่ดีของรายการนี้

เทมเพลตนี้จะสร้างวิธีการทดสอบใหม่ในชั้นเรียนโดยทำตามกระบวนทัศน์ที่กำหนด - เมื่อ - จากนั้นให้แนวทางจากกระบวนทัศน์การพัฒนาที่ขับเคลื่อนด้วยพฤติกรรม (BDD) ในความคิดเห็นเพื่อเป็นแนวทางสำหรับการจัดทำโค้ด มันจะเริ่มต้นชื่อเมธอดด้วย "ควร" และให้คุณแทนที่ส่วนที่เหลือของชื่อเมธอดดัมมี "CheckThisAndThat" ด้วยคำอธิบายที่ดีที่สุดของความรับผิดชอบของวิธีการทดสอบ หลังจากกรอกชื่อ TAB จะนำคุณตรงไปที่// Given sectionเพื่อให้คุณสามารถเริ่มพิมพ์เงื่อนไขเบื้องต้นของคุณ

ฉันได้แมปกับตัวอักษรสามตัว "tst" พร้อมคำอธิบาย "วิธีการทดสอบที่ควรได้รับเมื่อ - ตอนนั้น";)

ฉันหวังว่าคุณจะพบว่ามีประโยชน์อย่างที่ฉันเคยเห็นเมื่อ:

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

    // When


    // Then

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

ฉันชอบเทมเพลตนั้น ฉันเพิ่ม "ข้อยกเว้นการพ่น" เพื่อความสะดวกสบายในการทดสอบเพิ่มขึ้น
Torsten

ฉันชอบกระบวนทัศน์ของ BDD เทมเพลตที่ดีมากสำหรับสิ่งนั้น และโปรดทราบ: นักพัฒนาที่ดีและเพื่อนของคุณหายไปแล้ว!
bobbel

7

สปริงฉีด

ฉันรู้ว่านี่มันสายไปแล้วสำหรับเกม แต่นี่คือสิ่งที่ฉันใช้สำหรับ Spring Injection ในชั้นเรียน:

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

นี่คือตัวสร้างสำหรับคลาสที่ไม่สามารถใช้งานได้ทันที:

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

อันนี้สำหรับข้อยกเว้นที่กำหนดเอง:

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

ฉันชอบความคิดเห็นในชั้นเรียนที่สร้างขึ้นเช่นนี้:

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

"ฉัน ... " กระตุ้นให้ผู้พัฒนาอธิบายถึงสิ่งที่ชั้นเรียนทำในทันที ฉันดูเหมือนจะปรับปรุงปัญหาของคลาสที่ไม่มีเอกสาร

และแน่นอนว่า $ Id $ เป็นคำหลัก CVS ที่มีประโยชน์


5

ฉันใช้ตัวอย่างข้อมูลเหล่านี้เพื่อค้นหาnullค่านิยมและสตริงว่าง ๆ

ฉันใช้ "การทดสอบการโต้แย้ง" - เทมเพลตเป็นรหัสแรกในวิธีการของฉันเพื่อตรวจสอบข้อโต้แย้งที่ได้รับ

testNullArgument

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

คุณอาจต้องการเปลี่ยนข้อความแสดงข้อยกเว้นให้เหมาะสมกับมาตรฐานของ บริษัท หรือโครงการของคุณ อย่างไรก็ตามฉันขอแนะนำให้มีข้อความที่มีชื่อของอาร์กิวเมนต์ที่ละเมิด มิฉะนั้นผู้เรียกวิธีการของคุณจะต้องดูในรหัสเพื่อทำความเข้าใจกับสิ่งที่ผิดพลาด (A ที่NullPointerExceptionไม่มีข้อความจะสร้างข้อยกเว้นด้วยข้อความ "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}");
}

นอกจากนี้คุณยังสามารถใช้เทมเพลตการตรวจสอบว่างจากด้านบนและใช้ตัวอย่างข้อมูลนี้เพื่อตรวจสอบสตริงว่างเท่านั้น จากนั้นคุณจะใช้สองแม่แบบเหล่านี้เพื่อสร้างรหัสข้างต้น

อย่างไรก็ตามเทมเพลตดังกล่าวข้างต้นมีปัญหาว่าหากการโต้แย้งเป็นที่สิ้นสุดคุณจะต้องแก้ไขรหัสที่ผลิตบางส่วน ( ${varName} = ${varName}.trim()จะจะล้มเหลว)

หากคุณใช้อาร์กิวเมนต์สุดท้ายจำนวนมากและต้องการตรวจสอบสตริงที่ว่างเปล่า แต่ไม่จำเป็นต้องตัดมันเป็นส่วนหนึ่งของรหัสของคุณคุณสามารถใช้สิ่งนี้แทน:

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

ฉันยังสร้างตัวอย่างบางส่วนสำหรับการตรวจสอบตัวแปรที่ไม่ได้ส่งเป็นอาร์กิวเมนต์ (ความแตกต่างใหญ่คือประเภทข้อยกเว้นตอนนี้เป็นแบบIllegalStateExceptionแทน)

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

นี่คือเทมเพลตทั่วไปสำหรับการทดสอบตัวแปร ฉันใช้เวลาสองสามปีในการเรียนรู้ที่จะชื่นชมสิ่งนี้จริง ๆ ตอนนี้ฉันใช้มันมาก (เมื่อใช้ร่วมกับเทมเพลตข้างต้นแน่นอน!)

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

คุณป้อนชื่อตัวแปรหรือเงื่อนไขที่ส่งคืนค่าตามด้วยตัวถูกดำเนินการ ("==", "<", ">" ฯลฯ ) และค่าหรือตัวแปรอื่นและหากการทดสอบล้มเหลวรหัสผลลัพธ์จะส่ง IllegalArgumentException

เหตุผลสำหรับความซับซ้อนเล็กน้อยหากข้อด้วยการแสดงออกทั้งหมดห่อใน "! ()" คือการทำให้มันเป็นไปได้ที่จะนำมาใช้ใหม่สภาพการทดสอบในข้อความข้อยกเว้น

บางทีมันอาจจะทำให้เพื่อนร่วมงานสับสน แต่ถ้าพวกเขาต้องดูรหัสที่พวกเขาอาจไม่ต้องทำถ้าคุณโยนข้อยกเว้นประเภทนี้ ...

นี่คือตัวอย่างของอาร์เรย์:

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

คุณได้รับผลลัพธ์นี้โดยเรียกใช้เทมเพลตโดยพิมพ์ "from.length" [TAB] "== to.length"

ผลลัพธ์นั้นสนุกกว่า "ArrayIndexOutOfBoundsException" หรือคล้ายกันและอาจทำให้ผู้ใช้ของคุณมีโอกาสที่จะเข้าใจปัญหา

สนุก!


4

ฉันใช้สิ่งนี้กับ MessageFormat (โดยใช้ Java 1.4) ด้วยวิธีนี้ฉันมั่นใจว่าฉันไม่มีการต่อข้อมูลที่ยากที่จะแยกออกเมื่อดำเนินการเป็นสากล

i18n

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

สำหรับการบันทึกด้วย:

เข้าสู่ระบบ

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

4

คนโปรดของฉันคือ ...

1: Javadoc เพื่อแทรก doc เกี่ยวกับวิธีการเป็นวิธีการฉีดอ็อบเจ็กต์สปริง

 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: หน้าต่าง Debug เพื่อสร้าง FileOutputStream และเขียนเนื้อหาของบัฟเฟอร์ลงในไฟล์ ใช้สำหรับเมื่อคุณต้องการเปรียบเทียบบัฟเฟอร์กับการรันที่ผ่านมา (ใช้ BeyondCompare) หรือหากคุณไม่สามารถดูเนื้อหาของบัฟเฟอร์ (ผ่านการตรวจสอบ) เนื่องจากมีขนาดใหญ่เกินไป ...

java.io.FileOutputStream fos = new java.io.FileOutputStream( new java.io.File("c:\\x.x"));
fos.write(buffer.toString().getBytes());
fos.flush();
fos.close();
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.