자바의 Immutable 객체

Y39·2023년 4월 1일
0

toBeProgrammer

목록 보기
70/88

movie

Immutable 객체

: 객체 생성 후에 상태가 변하지 않는 객체

장점

  • 개발하기 쉽고 안정적인 코드가 된다.
    • 불변 객체라면, 상태가 변경되지 않기 때문에 코드 작업에 확실함이 생김
  • map, set, cach에 쓰기 좋다.
    • 객체 상태에 변화가 생겨 생길 수 있는 문제를 막음
  • 일반적으로 thread-safe이다.
  • 방어적 복사를 할 필요가 없다.

String은 불변객체

사용법

  1. setter 제거
  2. 상태를 pricate final로 선언
  3. class를 fianl로 선언
  • override를 막음
  1. immutable에 mutable한 객체를 주입받을 때: 방어적 복사
  • mutable 객체를 final 선언
  • mutable 객체를 this로 바로 받지 말로 새롭게 생성
  • getter에서도 객체를 그대로 반환하지 않고 새 객체를 생성해서 return
    => 결론: mutable 객체의 레퍼런스를 공유해서 사용하지 말 것
    
    //mutable한 클래스: 포켓몬-메타몽
    //메타몽은 상태를 마음대로 바꿀 수도 있음
    //ex level=100인 메타몽A: metamongA.level=1 => 1로 바뀜
    public class Metamong extends MutablePokmon{
    	public int level;
        public String skill;
        ...
        getter 그리고 setter
    }
    //immutable한 클래스: pokeball
    //요리조리 바꿀 수 있는 메타몽을 변경 불가능하게 막아야함
    public final class Pokeball{
    //생성자에서 막는다고 다가 아님!
    /*
    	Metamong metamogA = new Metagmon(100, "따라쟁이")
        Pokeball speedball = new Pokeball(metamongA);
        //포켓볼에 메타몽은 변경되어선 안됨.
        metamongA.skill = "반사하기";
        speedball.getSkill; => 반사하기
    */
    	private final Metamong metamong;
        
        //생성자에 넣으려는 객체를 복제해서 넣어줌
        // 메타몽A로 접근 불가하게 막음
    	public Pokeball(Metamong metamong){
    		this.metamog = new Metamong(metamong.level, metamong.skill); 
    	}
        
        //get으로 받아온 메타몽을 변경 -> 포켓볼의 메타몽도 변경
        //포켓볼의 복제 메타몽을 보내서 접근 불가하게 막음
    	public getMetamong(){
        	return new Mutable(metamong.level,  metamong.skill);
        }
        }
profile
System.out.print("Bold")

0개의 댓글