2008-10-25 2 views
20

Является ли хорошей практикой позволить абстрактным классам определять переменные экземпляра?Java - абстрактный класс для хранения переменных?

public abstract class ExternalScript extends Script { 

    String source; 

    public abstract void setSource(String file); 

    public abstract String getSource(); 
} 

Суб класса, ExternalJavaScript.class, будет автоматически получать переменную источника, но я чувствую, что это легче читать код, если все суб сами классы определяют источник, а не от наследования.

Каков ваш совет?

/Adam

ответ

29

Я бы подумал, что что-то вроде этого будет намного лучше, так как вы добавляете переменную, так почему бы не ограничить доступ и сделать его более чистым? Ваши геттеры/сеттеры должны делать то, что они говорят на олове.

public abstract class ExternalScript extends Script { 

private String source; 

public void setSource(String file) { 
    source = file; 
} 

public String getSource() { 
    return source; 
} 

Возвращаясь к этому вопросу, вы когда-нибудь задумывались о том, где он читает код получателя/сеттера? Если все они получают и устанавливают, вам не нужно беспокоиться о том, что функция «делает» при чтении кода. Есть несколько других причин, чтобы думать о слишком:

  • Если источник был защищен (так доступны подклассов), то код получает грязный: кто изменяющие переменные? Когда это объект, он становится тяжелым, когда вам нужно реорганизовать, тогда как метод имеет тенденцию облегчать этот шаг.
  • Если ваши методы getter/setter не получают и не устанавливают, то описывайте их как нечто другое.

Всегда думайте, действительно ли ваш класс или нет, и это должно помочь решить, нужно ли вам что-то еще.

6

Конечно ... Почему бы и нет?
Абстрактные базовые классы - это просто удобство для размещения поведения и данных, общих для 2 или более классов, в одном месте для повышения эффективности хранения и обслуживания. Его деталь реализации.
Позаботьтесь о том, чтобы вы не использовали абстрактный базовый класс, где вы должны использовать интерфейс. Обратитесь к Interface vs Base class

1

Конечно. Вся идея абстрактных классов состоит в том, что они могут содержать какое-либо поведение или данные, которые вам требуются для всех подклассов. Подумайте о простом примере WheeledVehicle - он должен иметь переменную члена numWheels. Вы хотите, чтобы все под-классы имели эту переменную. Помните, что абстрактные классы очень полезны при разработке API-интерфейсов, так как они могут гарантировать, что люди, которые расширяют ваш API, не нарушают его.

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