Вопрос

Стремясь уменьшить количество 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