2013-11-07 8 views
3

Чтобы уменьшить количество NCSS класса (~ 850), я разделил все методы на свои собственные классы и упростил работу, расширяя абстрактный класс, который содержит весь помощник функции.Lazy инициализация подкласса

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); 
    } 
} 

Я попытался создать функцию Initialise в классе MyBaseClass, который принимает подтип в качестве параметра и создать объект на основе своего класса:

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

, но это некрасиво, и я должен иметь один на суб- класс.

Итак, что такое «правильный» способ сделать это? Иногда, когда класс вызывается, мы будем использовать только один или два метода, поэтому я не хочу каждый раз инициализировать все подклассы.

ответ

1

Создание классов в Java на самом деле дешево. Если классы ничего существенного в их contructors не делать, то просто сделать

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

Не оптимизировать, где это не Обязательное. Профилируйте свой код раньше. Вы можете быть удивлены, насколько ошибочны ваши предположения (я знаю, что я был много раз).

4

Мне кажется, что вы действительно хотите использовать статические методы, а не абстрактные вспомогательные классы, возможно, вместе с import static.

Таким образом, класс (ы), определяющий эти методы, будет, по вашему желанию, инициализироваться только после вызова методов.

Вы также не ограничивали бы свою структуру наследования в целом тем, где методы должны быть определены.

Это предполагает, что вы не используете данные экземпляра для этих методов, конечно; но из внешнего вида вашего кода примера это не так.

+0

Не могли бы вы расширить немного больше? Вы имеете в виду, что если бы я сделал методы в «AccountData» 'public static', тогда я мог бы просто ссылаться на них в MyBaseClass (при условии, что я их импортировал)? И, извините, но да, есть экземпляры данных в классах, и они не могут быть статическими (но это моя ошибка, если вы не указали это заранее) – Omertron

Смежные вопросы