728x90
반응형
1. 배경
생성자 내부에서 메서드를 실행할려고 했다. 아래와 같은 코드이다.
public MessageQueueAccessor(String name) {
super();
this.name = name;
}
public MessageQueueAccessor(String name, String url) {
super();
this.name = name;
this.url = url;
this.sendMessage();
//중략
private void sendMessage() {
//로직
}
}
즉 name, url을 인자로 받는 특정 생성자를 통해 인스턴스를 생성하는 경우 필드값을 초기화할 뿐 아니라, 멤버 메서드인 sendMessage 로직도 실행하고자 했다.
그런데 역할상 생성자가 초기화에만 관여해야지, 어떤 로직을 실행하는 역할을 해도 될까? 라는 의문이 들었다.
2. 결론
결론은 사용해도 된다. 다만 참조1에 따르면, 아래 규칙을 지켜야한다.
- 생성자에서만 사용하는 메서드라면 private 처리를 하여 다른 곳에서는 Override하여 사용할 수 없도록 해야한다.
- 생성자 외 다른 곳에서도 사용한다면 final 처리를 하여 재할당이 불가하도록 해야한다.
- 멤버 변수와 관련된 로직이 들어간 메서드라면 에러가 날 수 있다.
2. 관련, final void sendMessage() {... }와 같은 형식으로 사용한다.
3. 관련, 생성자를 통해 인스턴스가 초기화되기 전인데 메서드에서 멤버 변수를 사용해버리면 변수값이 제대로 설정되지 않는 에러가 발생할 수도 있으니 사용을 자제하는 편이 좋다.
참조
1) 스택 오버 플로우 - Can I call methods in constructor in Java?
https://stackoverflow.com/questions/5230565/can-i-call-methods-in-constructor-in-java
728x90
반응형
'Programming-[Backend] > Java' 카테고리의 다른 글
에러 발생 시 특정 기능을 하도록 만들기 : 정적 팩토리 메서드 (0) | 2022.06.01 |
---|---|
[TIL][링크] 자바 리스트 stream split 처리 - groupingBy (0) | 2022.05.24 |
[링크] isAssignableFrom 과 instanceof의 차이 (0) | 2022.03.03 |
[TIL][링크][작성중] 자바 어노테이션 및 리플렉션(Java Annotation, Reflection) (0) | 2022.02.22 |
[작성중] 서비스 버스, jms 등 (0) | 2021.12.21 |