Геттер / Сеттер (состав, Java, HW) - PullRequest
4 голосов
/ 26 апреля 2010

У меня есть один класс с именем Person, который в основном выглядит так:

public class Person
{
    String firstName;
    String lastName;
    String telephone;
    String email;

    public Person()
    {
       firstName = "";
       lastName = "";
       telephone = "";
       email = "";
    }

    public Person(String firstName, String lastName, String telephone, String email) 
    {
        this.firstName = firstName;
        this.lastName = lastName;
        this.telephone = telephone;
        this.email = email;
    }

    public String getFirstName()
    {
        return firstName;
    }

    public void setFirstName(String firstName)
    {
        this.firstName = firstName;
    }
 ....

Используя этот класс, я установил абстрактный класс с именем Loan, который выглядит следующим образом:

public abstract class Loan
{   
    public void setClient(Person client)
    {
        this.client = client;
    }

    public Person getClient()
    {
        return client;
    }

    public void setLoanId(int nextId)
    {
        loanId = nextId;
        nextId++;
    }

    public int getLoanId()
    {
        return loanId;
    }

    public void setInterestRate(double interestRate)
    {
        this.interestRate = interestRate;
    }

    public double getInterestRate()
    {
        return interestRate;
    }

    public void setLoanLength(int loanLength)
    {
        this.loanLength = loanLength;
    }

    public int getLoanLength()
    {
        return loanLength;
    }

    public void setLoanAmount(double loanAmount)
    {
        this.loanAmount = loanAmount;
    }

    public double getLoanAmount(double loanAmount)
    {
        return loanAmount;
    }

    private Person client;
    private int loanId;
    private double interestRate;
    private int loanLength;
    private double loanAmount;
    private static int nextId = 1;

}

Мне нужно расширить класс Loan с помощью CarLoan, и это выглядит так:

public class CarLoan extends Loan
{
    public CarLoan(Person client, double vehiclePrice, double downPayment, double salesTax,
                    double interestRate, CAR_LOAN_TERMS length)
    {
        super.setClient(client);
        super.setInterestRate(interestRate);
        this.client = client;
        this.vehiclePrice = vehiclePrice;
        this.downPayment = downPayment;
        this.salesTax = salesTax;
        this.length = length;

    }

    public void setVehiclePrice(double vehiclePrice)
    {
        this.vehiclePrice = vehiclePrice;
    }

    public double getVehiclePrice()
    {
        return vehiclePrice;
    }

    public void setDownPayment(double downPayment)
    {
        this.downPayment = downPayment;
    }

    public double getDownPayment()
    {
        return downPayment;
    }

    public void setSalesTax(double salesTax)
    {
        this.salesTax = salesTax;
    }

    public double getSalesTax()
    {
        return salesTax;
    }

    public String toString()
    {
        return getClass().getName() + "[vehiclePrice = " + vehiclePrice + '\n' 
                                        + "downPayment = " + downPayment + '\n'
                                        + "salesTax = " + salesTax 
                                        + "]";
    }

    public enum CAR_LOAN_TERMS {TWO_YEAR, THREE_YEAR, SIX_YEAR};
    private double vehiclePrice;
    private double downPayment;
    private double salesTax;

Несколько вопросов.

(а) Является ли то, что я сделал в классе Loan для правильной установкиClient, учитывая то, что у меня есть в классе Person? (например, этот клиент = клиент)

(б) Могу ли я вызвать супер дважды в методе? Я должен установить два атрибута из класса Loan из конструктора в классе CarLoan, и я подумал, что это будет способ сделать это.

(c) Нужно ли устанавливать атрибуты для типов перечисления по-разному в методах конструктора или метода получения / установки? Я получаю сообщение об ошибке (this.length = length) в своем классе CarLoan, и я не был уверен в том, как следует устанавливать значения перечисления. Спасибо!

Ответы [ 3 ]

2 голосов
/ 26 апреля 2010

ОК, по порядку:

  1. setClient Выглядит отлично. Ничего плохого в этом нет. Однако вы хотите избежать установки this.client непосредственно в конструкторе CarLoan - вы уже вызываете setClient (благодаря @Gabriel и @Aeth).
  2. Конечно, вы можете использовать super для доступа к методам родительского класса столько, сколько вам нужно. Вы должны быть осторожны с вызовом конструктора суперкласса , который вы можете сделать только один раз и в начале конструктора подкласса. super != super().
  3. Нет, this.length = length в порядке. Проблема в том, что у вас нет поля с именем length. Возможно, вы захотите добавить один из них.
1 голос
/ 26 апреля 2010

1) Обычно объявления атрибутов класса ставятся перед конструкторами и методами.

2) Оператор this.client = client; в классе CarLoan выдаст ошибку компиляции, поскольку поле client объявлено как личное в классе Loan. (И это утверждение в любом случае является избыточным, потому что вы только что инициализировали то же поле с помощью установщика ... хотя ожидайте, что вы уже знали это.)

3) Лучший способ инициализировать поля суперкласса - передать аргументы конструктору суперкласса. Например:

public abstract class Loan
{   
    private Person client;
    private double interestRate;

    public Loan(Person client, double interestRate) {
        this.client = client;
        this.interestRate = interestRate;
    }
    ...
}

public class CarLoan extends Loan
{   
    ...

    public CarLoan(Person client, double vehiclePrice, double downPayment, double salesTax,
                    double interestRate, CAR_LOAN_TERMS length)
    {
        super(client, interestRate); 
        this.vehiclePrice = vehiclePrice;
        ...
    }
}

Причина, по которой этот подход лучше, заключается в том, что класс Loan берет на себя ответственность за его инициализацию и не полагается на различные конструкторы подклассов, выполняющие эту работу. (Если вы добавите дополнительное поле к Loan и добавите соответствующий параметр в конструктор Loan, компилятор напомнит вам изменить все конструкторы подкласса, чтобы обеспечить начальное значение в цепочке конструктора super. Если подклассы отвечают за установку полей в базовом классе во время инициализации, тогда компилятор не заметит, что вы забыли добавить новый вызов сеттера.)

4) Если вы вызываете методы в конструкторе, рекомендуется не допускать их переопределения в подклассе. (Нет ... это не совсем неправильно для методов, которые будут переопределены, но есть вещи, которые могут пойти ужасно неправильно. Вызов потенциально переопределяемых методов в конструкторе делает ваш код хрупким.)

5) Если бы это был рабочий код, то использование float или double для представления значений валюты было бы большим нет-нет!

0 голосов
/ 27 апреля 2010

Отвечая на вопрос (c), я думаю, что вы получаете ошибку, потому что вам нужно определить длину вместе с уже определенными переменными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...