의 코드 조각 다음 가정 해 봅시다 :메서드 개체에서 정적 메서드 호출을 래핑하는 오버 헤드는 무엇입니까?
public class NotThatWellWrittenClass {
public static void doSmth() {
/*
This code part is actually irrelevant.
*/
}
}
몇 가지 다른 클래스를 사용하는 것이 그 폴더의 유틸리티 다음과 같이 : NotThatWellWrittenClass.do()
를 유일한 오버 헤드가 실제로 performing a method call 관련이 있도록.
정말 프로그래밍 방식이 좋지 않으므로 정적 메서드 호출을 사용하는 클라이언트를 손상시키지 않으면 서이 코드 부분을 리팩토링하고 싶습니다. 리팩토링 미리보기 :
public class NotThatWellWrittenClass {
public static void doSmth() {
new WorkUtil().doSmth();
}
}
public class WorkUtil() {
public void doSmth() {
/*
This code part is actually irrelevant.
*/
}
}
지금, 코드가 훨씬 더 객체 지향하고 테스트하고 재사용하기 쉽다. 그러나 이제는 여분의 객체 (메모리 할당)를 만들고 정적 호출 대신 인스턴스 메서드 호출을 수행합니다 (JVM에서 다르게 최적화 됨).
다시 질문을 드리면 다음과 같은 리팩토링에서 눈에 띄는 오버 헤드가 있습니까? 어쩌면 다른 방식으로 수행해야할까요? (나는 항상 객체에 객체를 캐시 할 수 있지만 그만한 가치가 있나?)
감사의 말을 전하고 싶습니다.
나는 이로 인한 오버 헤드를 전혀 느끼지 못했습니다. 대부분의 알고리즘 문제, 거의 코드가없는 비트 및 성능/OO 트레이드 오프가 거의 모든 코드에서 발생하기 때문입니다. 그러나 당신이 정말로 걱정한다면, 당신의 메소드와 클래스를'final'으로 선언하십시오, VM에 가상 호출을 할 필요가 없다는 힌트를줍니다. – biziclop