Java/Language

Java Method Chaining : '자바에서 메소드 이어서 쓰기' 랄까?

허니몬 2011. 7. 17. 00:45
Method chaining - Wikipidea : http://en.wikipedia.org/wiki/Method_chaining

자바 7에 추가될뻔한 기능이었다고 한다. ^^; 자바의 빈클래스에 막 길들어지기 시작한 내게는 조금 낯선 형태랄까?
setter 메소드에서 클래스(this)를 리턴해주는 형태니까...

Chaining.java
public class DateChaining {

    private String year;
    private String month;
    private String day;
    
    public String getMonth() {
        return month;
    }

    public DateChaining setMonth(String month) {
        this.month = month;
        return this;
    }

    public String getDay() {
        return day;
    }

    public DateChaining setDay(String day) {
        this.day = day;
        return this;
    }

    public String getYear() {
        return year;
    }

    public DateChaining setYear(String year) {
        this.year = year;
        return this;
    }

    @Override
    public String toString() {
        return "DateChaining [year=" + year + ", month=" + month + ", day="
                + day + "]";
    }

}

ChainingTest.java
package test;

import main.DateChaining;
import static org.junit.Assert.*;
import static org.hamcrest.CoreMatchers.*;

import org.junit.Test;

public class ChainingTest {
    
    @Test
    public void 체이닝_테스트() {
        //given
        DateChaining chain = new DateChaining();
        //when
        chain.setYear("2011").setMonth("07").setDay("17");
        //then
        assertThat(chain.getYear(), is("2011"));
        assertThat(chain.getMonth(), is("07"));
        assertThat(chain.getDay(), is("17"));
    }
    
    @Test
    public void 순서흐트러진_체이닝_테스트() {
        //given
        DateChaining chain = new DateChaining();
        //when
        chain.setMonth("07").setDay("17").setYear("2011");
        //then
        assertThat(chain.getYear(), is("2011"));
        assertThat(chain.getMonth(), is("07"));
        assertThat(chain.getDay(), is("17"));
    }
    
    @Test
    public void 중복된_필드에대한_세트선언시() {
      //given
        DateChaining chain = new DateChaining();
        //when
        //
        chain.setYear("2011").setMonth("07").setDay("17").setYear("2012");
        //then
        assertNotSame(chain.getYear(), is("2011"));
        assertThat(chain.getMonth(), is("07"));
        assertThat(chain.getDay(), is("17"));
    }
}
이렇게 쓰는 것에 낯설기는 하지만... 익숙하게 사용했을때 어떤 장점이 있는지 확인해보고 익혀두는 것도 나쁘지 않겠다.