2017-10-26 1 views
-1

모든 하위 인스턴스가 동일한 값을 반환해야하는 경우가 있습니다. 많은 인스턴스가 있기 때문에 사용하는 메모리의 양을 줄이려고합니다. 다음 실험을 만들었습니다.모든 클래스 인스턴스가 동일한 값을 반환 할 때 사용되는 메모리 및 LOC 최적화

1) 필드를 사용하고 메서드를 한 번 구현하십시오. 이 구현은 24 바이트를 사용합니다.

private abstract class A{ 

    private String string; 
    private int i; 

    public A(String string, int i) { 
     this.string = string; 
     this.i = i; 
    } 

    public String getName() { 
     return string; 
    } 

    public int getAge() { 
     return i; 
    } 

} 

private class B extends A{ 


    public B() { 
     super("B",10); 
    } 

} 

2) 각 클래스에 대해 메소드를 다시 구현합니다. (이 구현은 16 바이트를 사용합니다)

private abstract class A{ 

    public abstract String getName(); 
    public abstract int getAge(); 

} 

private class B extends A{ 

    @Override 
    public String getName() { 
     return "B"; 
    } 

    @Override 
    public int getAge() { 
     return 10; 
    } 

} 

VisualVm을 사용하여 객체 크기를 읽었습니다. 메모리 사용량을 줄이면서 메서드를 한 번만 구현할 수있는 방법을 본 사람이 있습니까?

미리 감사드립니다.

편집 : 제 질문은 몇 번이나 downvoted 때문에 제게 어떻게 개선 할 수 있는지 알려주세요.

+0

두 번째 예제에서 'A'인터페이스를 만들려고 했습니까? – Bernat

+0

@Bernat 이것은 단지 예일뿐입니다. 내 진짜 응용 프로그램에서 A는 몇 가지 일반적인 방법을 제공하는 클래스입니다. –

+0

downvote : 왜 그것이 나쁜 질문이 될지 모르겠다. 나는 사람들이 마이크로 최적화를 좋아하지 않는다고 생각한다. – Joel

답변

1

더 미묘합니다. 실제로 모든 자식 클래스에 특정 클래스 (정적) 상수를 갖기를 원합니다. Java는 다른 방법을 제공하지 않는 것처럼 비 정적 메서드가 사용됩니다.

덜 깔끔하게 보이지만 두 번째 해법이 더 적합 해 보입니다. 좋은 코드 스타일에 대한 내 감각은 무엇인가.

불변 클래스에서 모든 상수를 수집하고 두 방법 중 하나를 사용하는 방법을 제안합니다. 두 번째 방법은 더 좋지만 방법이 필요합니다. 하나는 클래스의 정적 상수 및 최적의 메모리 RESP를 사용하여 두 의도 다음 그것을 할 수 그러나

. 모든 분야에서 동일한 데이터를 복사하지 : 자식 클래스 당

class MetaData { 
    public final String string; 
    public final int i; 
    MetaData(String string, int i) { 
     this.string = string; 
     this.i = i; 
    } 
} 

그냥 하나 개의 인스턴스. 사실 사람이 대신 생성자 + 슈퍼 필드 물론

private abstract class A { 
    protected final MetaData metaData; 

    public A(MetaData metaData) { 
     this.metaData = metaData; 
    } 

    public String getName() { 
     return metaData.string; 
    } 

    public int getAge() { 
     return metaData.i; 
    } 

    public MetaData getMetaData() { 
     return metaData; 
    } 
} 

private class B extends A { 

    private static final MetaData b = new MetaData("B", 10); 
    public B() { 
     super(b); 
    } 
} 

클래스 A에 자식 클래스하지만 공장 및 위임을 사용하지 고려할 수, 하나 더

protected abstract MetaData getMetaData(); 

    @Override 
    protected MetaData getMetaData() { 
     return b; 
    } 

을 만들 수있는 장점은 때 것 나중에 추가 상수가 계층 구조에 추가되어야합니다.

+0

추상 레이어에서'protected final MetaData metaData; '가 바이트 오버 헤드를 추가하지 않을지 궁금합니다. 메모리 측면에서 OP 첫 번째 예제와 거의 동일하며 추가 클래스가 있습니다. – Joel

+0

@Joel, 나는 여전히 편집 중이었고 상수 컨테이너에 대해서도 추상 메서드의 같은 기술을 사용할 수 있습니다. 당신 말이 맞습니다. –

+0

@JoopEggen 해결책 주셔서 감사합니다. 이것은 기본적으로 예제의 모든 하위 클래스 인스턴스를 메타 데이터 패키지의 하위 클래스 당 16 바이트 + 24 바이트로 만듭니다. 그것은 아주 좋은 해결책입니다. –

관련 문제