본문 바로가기
java/java 리팩토링

03. null 객체 사용

by 문자메일 2023. 2. 7.

null 객체 사용시 문제점

  • 객체의 null 여부를 확인하는 코드가 너무 많은 경우
    • null 체크 적다면 리팩토링 안 해도 됨
  • 아무것도 안하는 객체를 만들어 사용함으로 null 확인 코드를 줄인다.

리펙토링 단계

  1. null 객체 클래스를 작성한다.
    기존에 null을 체크하는 클래스의 하위 클래스로 생성
    해당 클래스에 isNull() 이라는 null 체크하는 메서드 구현, 기존 클래스는 false, null 클래스는 true로 반환하게 한다.
  2. null 치환하기
    null 코드 부분을 isNull() 메서드로 치환한다.
  3. null 객체 클래스를 재정의하여 조건 판단진행
    isNull() 메서드를 사용하는 제어문을 찾아서 다음과 같이 수정

 

AS-IS

package introducenullobject.before;

public class Label {
	
	private String label;
	
	public Label(String label) {
		this.label = label;
	}
	
	public void display() {
		System.out.println("display: " + label);
	}
	
	public String toString() {
		return "\"" + label + "\"";
	}

}

 

package introducenullobject.before;

public class Person {
	private Label name;
	private Label mail;
	
	public Person(Label name, Label mail) {
		this.name = name;
		this.mail = mail;
	}
	
	public Person(Label name) {
		this(name, null);
	}
	
	public void display() {
		if(name != null) {
			name.display();
		}
		
		if(mail != null) {
			mail.display();
		}
	}
	
	public String toString() {
		String result = "[ Person" ;
		
		result += "name :";
		if(name == null) {
			result += " \" (none) \"";
		}
		else {
			result += name;
		}
		
		result += "mail :";
		if(mail == null) {
			result += " \" (none) \"";
		}
		else {
			result += mail;
		}
		
		result += " ]";
		
		return result;
	}
}

 

package introducenullobject.before;

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		Person[] people = {
				new Person(new Label("Alice"), new Label("alice@aaa.com")),
				new Person(new Label("Tomas"), new Label("tomas@aaa.com")),
				new Person(new Label("James") ),
		};
		
		for(Person person : people) {
			System.out.println(person.toString());
			person.display();
			System.out.println();
		}
	}
	
}

 

 

 

TO-BE

package introducenullobject.after;

public class Label {
	
	private String label;
	
	public Label(String label) {
		this.label = label;
	}
	
	public void display() {
		System.out.println("display: " + label);
	}
	
	public String toString() {
		return "\"" + label + "\"";
	}
	
	public boolean isNull() {
		return false;
	}

}

 

 

package introducenullobject.after;

public class Person {
	private Label name;
	private Label mail;
	
	public Person(Label name, Label mail) {
		this.name = name;
		this.mail = mail;
	}
	
	public Person(Label name) {
		this(name, new NullLabel());
	}
	
	public void display() {
		name.display();
		mail.display();
	}
	
	public String toString() {
		String result = "[ Person + name =" + name + " mail =" +  mail + "]" ;
		return result;
	}
}

 

package introducenullobject.after;

public class NullLabel extends Label{

	public NullLabel() {
		super(" (none) ");
	}
	
	public boolean isNull() {
		return true;
	}
	
	@Override
	public void display() {

	}
	

}

 

package introducenullobject.after;

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		Person[] people = {
				new Person(new Label("Alice"), new Label("alice@aaa.com")),
				new Person(new Label("Tomas"), new Label("tomas@aaa.com")),
				new Person(new Label("James") ),
		};
		
		for(Person person : people) {
			System.out.println(person.toString());
			person.display();
			System.out.println();
		}
	}
	
}

댓글