programing

유용한 Eclipse Java 코드 템플릿 찾기

firstcheck 2022. 8. 1. 21:22
반응형

유용한 Eclipse Java 코드 템플릿 찾기

Eclipse에서 다양한 Java 코드 템플릿을 생성할 수 있습니다.

창 > 설정 > Java > Editor > 템플릿

예.

sysout뭇매를 맞다

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

하려면 , 라고 입력하면 .sysout에 어 followed가 붙는다.CTRL+SPACE

현재 어떤 유용한 Java 코드 템플릿을 사용하고 있습니까?이름과 설명, 그리고 왜 멋진지 적어주세요.

빌트인 기존 기능이 아닌 오리지널/신규 템플릿을 사용하고 싶습니다.

  • Log4J 로거 생성
  • 디스플레이에서 SWT 색상 가져오기
  • Syncexec - 이클립스 프레임워크
  • 싱글톤 패턴/Enum 싱글톤 생성
  • 읽기 파일
  • 계속
  • 트레이스 아웃
  • 형식 문자열
  • 코멘트 코드 리뷰
  • 문자열 형식
  • 최종적으로 잠금 시도
  • 메시지 형식 i18n 및 로그
  • 등축업자
  • 해시코드빌더
  • 스프링 물체 주입
  • 파일 출력 스트림 생성

다음 코드 템플릿은 로거를 생성하고 필요에 따라 올바른 Import를 만듭니다.

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

로그4J

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

기타 템플릿 : Link I - Link II

난 이게 좋아.

판독 파일

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

문자열 포맷

MessageFormat - 선택 영역을 MessageFormat으로 둘러싼다.

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

이렇게 하면 커서를 문자열로 이동하고 선택 항목을 전체 문자열(Shift-Alt-Up)로 확장한 다음 Ctrl-Space를 두 번 누를 수 있습니다.

선택 영역을 잠급니다.

잠금 - 선택한 선을 최종적으로 잠금 시도로 둘러쌉니다.잠금 변수가 있다고 가정합니다.

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

NB${line_selection}템플릿은 [Surround With]메뉴(Alt-Shift-Z)에 표시됩니다.

제가 막다른 골대를 걷어차고 있는 건 알지만, 완성을 위해 이 내용을 공유하고 싶습니다.

이중 체크된 잠금 설계의 결함을 극복하는 싱글톤 생성 템플릿의 올바른 버전(위에서 설명하고 다른 곳에서 언급)

Singleton 작성 템플릿:이름을 대세요createsingleton

static enum Singleton {
    INSTANCE;

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

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


'CHANGE: 'CHANGE: 'CHANGE: 'CHANGE: 'CHANGE:

싱글톤 참조 템플릿:이름을 대세요getsingleton

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

을 추가해, 「」를 해 주세요.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();
    |
}

스크린샷

★★★의 log멤버 변수에 추가하는 데 도움이 되는 작은 디티입니다.

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

("Java 문" 컨텍스트에서) Mockito를 사용하여 모크를 만듭니다.

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

그리고 "자바 타입 멤버"에서:

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

void 메서드를 모의하여 예외를 발생시킵니다.

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

1회 호출된 조롱된 메서드를 확인합니다.

${: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를 사용한 새 링크 목록(해시 세트 및 해시 맵도 유사):

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

특수한 체크!

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

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

내가 사랑하는 사람 중 하나는 포어치야

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

트레이스아웃은 추적에 많이 사용하고 있기 때문에

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

또 다른 것을 생각하고, 언젠가 인터넷을 통해서 그것을 발견했습니다, 라고 말합니다.

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

sysout에 대한 힌트입니다.이름을 "sop"으로 바꾸고 싶습니다.java libs의 다른 어떤 것도 "sop"으로 시작하지 않기 때문에 "sop"과 "boom"을 빠르게 입력할 수 있습니다.

legal Argument를 던지다현재 범위에 변수가 있는 예외(larg):

throw new IllegalArgumentException(${var});

낫다.

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

코드 제작에는 화려하지 않지만 코드 리뷰에는 매우 유용합니다.

내 템플릿 coderev low/med/high가 다음 작업을 수행합니다.

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

그런 다음 [태스크] 보기에서 회의 중에 제기할 코드 검토 의견을 모두 표시합니다.

여기에 템플릿이 더 있습니다.

내용:

  • 특정 날짜에서 날짜 개체 만들기
  • 새로운 범용 Array List를 만듭니다.
  • 로거 셋업
  • 지정된 수준의 로그
  • 새 일반 해시 맵을 만듭니다.
  • 지도를 반복하여 키와 값을 인쇄합니다.
  • SimpleDateFormat을 사용하여 시간 구문 분석
  • 파일을 한 줄씩 읽다
  • 검출된 설명을 로그에 기록하고 다시 던집니다.
  • 코드 블록 인쇄 실행 시간
  • 정기 타이머 생성
  • 파일에 문자열 쓰기

slf4j 로깅

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

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

콩 속성

private ${Type} ${property};

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

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

Property Change 지원

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

Post Java 7은 엔클로징 클래스에 대한 정적 참조를 필요로 하는(또는 선호하는) 로거를 설정하는 가장 좋은 방법은 새로 도입된 MethodHandles API를 사용하여 정적 컨텍스트에서 런타임 클래스를 가져오는 것입니다.

SLF4J의 스니펫의 예를 다음에 나타냅니다.

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

IDE에서 단순한 스니펫이 되는 것 외에 클래스 이름을 실수로 옮기지 않기 때문에 특정 기능을 다른 클래스로 리팩터링하는 경우에도 덜 취약합니다.

GUI 스레드에서 코드 호출

.slaterGUI gui gui gui 、 GUI 。

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

코드를 사용하여 테스트할 때 시스템 삭제를 놓칠 수 있습니다.그래서 저는 syt라는 템플릿을 만들었습니다.

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

컴파일하기 전에 항상 TODO를 확인하고 시스템 삭제를 잊지 않습니다.또 나갔어.

strf -> String.format("msg", args)꽤 간단하지만 타이핑은 조금 줄였습니다.

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

현재 디스플레이에서 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;
}

Equalbuilder, 해시코드빌더 적응:

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

로거 선언 템플릿은 훌륭합니다.

또한 자주 사용하는 로그레벨에 대해 linfo, ldebug, lwarn, lerror를 만듭니다.

lerror:

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

이벤트에 대한 모든 항목 생성

Java에서 이벤트 작성은 번거롭기 때문에 하나의 이벤트에 필요한 모든 것을 작성하기 위한 간단한 템플릿을 만들었습니다.

${: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____().

범용 인터페이스와 범용 클래스를 사용하여 작고 우아한 이벤트 메커니즘을 작성했지만 Java의 범용 처리 방식 때문에 작동하지 않습니다.=(

편집: 1) 이벤트 진행 중에 스레드가 청취자를 추가/삭제하는 문제가 발생했습니다.List수 때문에 했습니다.synchronized목록 자체를 잠그는 수신자 목록이 액세스 또는 사용되는 블록입니다.

다음 테스트 방법 삽입:

최근 매우 좋은 개발자, 친구와 짝을 지어 프로그래밍을 하다가 이와 비슷한 버전을 보았는데, 이 목록에 추가해도 좋을 것 같습니다.

템플릿은 코멘트상의 행동중심개발(BDD) 패러다임에 따라 코드구조를 위한 가이드로 클래스에 새로운 테스트 방법을 만듭니다.그러면 메서드 이름이 "should"로 시작되고 나머지 더미 메서드 이름 "CheckThisAnd That"을 테스트 메서드의 책임에 대한 최상의 설명으로 대체할 수 있습니다.이름을 입력하면 TAB에서 바로// Given section을 사용하다

"Test methods should-given-when-then"이라는 세 글자에 매핑되어 있습니다.

내가 봤을 때처럼 유용했으면 좋겠어

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

    // When


    // Then

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

스프링 주입

좀 늦은 감이 있지만, 제가 수업 시간에 스프링 주입에 사용하는 것은 다음과 같습니다.

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

다음은 인스턴스화되지 않은 클래스의 컨스트럭터입니다.

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

이렇게 생성된 클래스 코멘트를 좋아합니다.

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

"I..."는 즉시 개발자에게 클래스가 무엇을 하는지 설명하도록 장려합니다.나는 등록되지 않은 수업의 문제를 개선하는 것 같다.

물론 $Id$는 유용한 CVS 키워드입니다.

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★null아아아아아아아아아아아아아아아아아아아아아아아아아아아.

수신된 인수를 체크하기 위해 메서드의 첫 번째 코드로 "argument test" 템플릿을 사용합니다.

test Null 인수

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

회사 또는 프로젝트의 표준에 맞게 예외 메시지를 변경할 수 있습니다.인수의 하는 것이 . 않으면 위해 합니다.(A)NullPointerException메시지가 없는 경우 상당히 터무니없는 메시지 "discuse"에서 예외가 생성됩니다.

test Null Or Empty String 인수

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

test Null 필드 상태

되지 않는 큰 타입으로, 타입으로 되어 ).IllegalStateException★★★★★★★★★★★★★★★★★★」

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

test Null Or Empty String Field State

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

test Argument(테스트 인수)

변수를 테스트하기 위한 일반적인 템플릿입니다.이것을 제대로 이해하는데 몇 년이 걸려서 지금은 많이 사용하고 있습니다(물론 위의 템플릿과 조합해서 사용).

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

값을 반환하는 변수 이름 또는 조건을 입력한 후 오퍼랜드("==", "<", ">" 등)와 다른 값 또는 변수를 입력하면 테스트가 실패하면 결과 코드가 IlgalArgument를 슬로우합니다.예외.

식 전체가!("")로 둘러싸인 약간 복잡한 if구가 있는 이유는 예외 메시지에서 테스트 조건을 재사용할 수 있도록 하기 위해서입니다.

동료들을 혼란스럽게 할 수도 있지만, 코드를 봐야만 한다면, 이런 종류의 예외를 둔다면 그럴 필요가 없을지도 모릅니다.

어레이의 예를 다음에 나타냅니다.

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" 또는 이와 유사한 결과보다 훨씬 재미있으며 실제로 사용자에게 문제를 파악할 수 있는 기회가 주어질 수 있습니다.

맛있게 드세요!

MessageFormat(Java 1.4 사용)에 사용합니다.그래야 국제화를 할 때 추출하기 어려운 연계는 없을 것이다.

18n

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

내가 가장 좋아하는 몇 명은...

1: Javadoc, 스프링 객체 주입 방식인 메서드에 대한 문서를 삽입합니다.

 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: 디버깅창: FileOutputStream을 생성하여 버퍼의 내용을 파일에 씁니다.버퍼를 과거 실행과 비교(Beyond Compare 사용)하거나 버퍼의 내용이 너무 커서 볼 수 없는 경우(검사를 통해)에 사용합니다.

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

언급URL : https://stackoverflow.com/questions/1028858/seeking-useful-eclipse-java-code-templates

반응형