문제

NCSS 수업 수를 줄이기 위해 (~ 850), 나는 모든 방법을 자신의 클래스로 나누고 일을 더 쉽게 만들기 위해 모든 도우미 기능을 보유하는 추상 클래스를 확장했습니다.

AbstractMethod.class

public class AbstractMethod {
    protected String requestWebPage(URL url) {
        // download a webpage as a string
    }
}

Example "account" subclass

public class AccountData extends AbstractMethod {
    public String getAccount(String sessionId){
        String webPage = requestWebPage("http://google.com/"+sessionId);
        system.out.println(webPage);
        return webPage;
    }
}

이 메소드 클래스 중 약 10 개 클래스가 있으며 기본/기본 클래스의 메소드 중 하나가 다음과 같은 경우에만 초기화하려고합니다.

public class MyBaseClass() {
    private static AccountData ad;

    public MyBaseClass() {
        ad = new AccountData();  // Is there a better way?
    }

    public String getAccount(String sessionId) {
        return ad.getAccount(String sessionId);
    }
}

MyBaseClass 클래스에서 하위 유형을 매개 변수로 받아들이고 클래스를 기반으로 객체를 만드는 초기 기능을 작성하려고 노력했습니다.

private void initAccount() {
    if (ad == null) {
        ad = new AccountData();
    }
}

그러나 그것은 추악하고 하위 클래스 당 하나가 있어야합니다.

그렇다면 "올바른"방법은 무엇입니까? 때로는 클래스가 호출되면 메소드의 1 또는 2 만 사용하므로 매번 모든 하위 클래스를 초기화 할 필요가 없습니다.

도움이 되었습니까?

해결책 2

Java의 인스턴스팅 수업은 저렴합니다. 수업이 대조업에서 실질적인 일을하지 않으면 그냥

public String getAccount(String sessionId) {
    AccountData ad = new AccountData();
    return ad.getAccount(String sessionId);
}

Nessesary가 아닌 곳을 최적화하지 마십시오. 전에 코드를 프로필하십시오. 당신은 당신의 가정이 얼마나 잘못되었는지 놀랄 것입니다 (나는 여러 번 알고 있습니다).

다른 팁

당신이 정말로 원하는 것은 아마도 추상적 인 도우미 클래스보다는 정적 방법을 사용하는 것 같습니다. import static.

그렇게하면 해당 메소드를 정의하는 클래스 (ES)는 원하는대로 메소드가 실제로 호출되면 초기화됩니다.

또한 유전 구조를 일반적으로 방법이 정의되는 위치로 제한하지 않습니다.

물론 해당 방법에 인스턴스 데이터를 사용하지 않는다고 가정합니다. 그러나 샘플 코드의 외관에서 그렇게 보이지는 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top