Getter / Setter (composition, Java, HW)

I have one class called Person, which basically looks like this:

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

Using this class, I am setting up an abstract class called Loan, which looks like this:

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

I need to extend the Loan class with CarLoan and it looks like this:

 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; 

A few questions.

(a) Is what I did in the Loan class for setClient correct, given what I have in the Person class? (e.g. this.client = client)

(b) Can I call super twice in a method? I have to set two attributes from the Loan class from the constructor of the CarLoan class, and I thought this would be a way to do this.

(c) Do I need to set attributes for enumeration types differently in constructor methods or getter / setter methods? I get an error message (this.length = length) in my CarLoan class, and I did not know how enum values ​​should be set. Thanks!

+4
source share
3 answers

OK, in order:

  • setClient Looks great. There is nothing wrong with that. However, you do not want to set this.client directly in the CarLoan constructor - you are already calling setClient (thanks @Gabriel and @Aeth).
  • Of course, you can use super to access the methods of the parent class as much as you want. What you need to be careful about is calling the superclass constructor, which you can only do once and at the beginning of the subclass constructor. super != super() .
  • No, this.length = length is fine. The problem is that you do not have a field called length . You might want to add one of them.
+2
source

1) Typically, before constructors and methods, place class attribute declarations.

2) The operator this.client = client; in the CarLoan class will give you a compilation error because the client field is declared private in the Loan class. (And this statement is redundant anyway, because you just initialized the same field with setter ... although you expect that you already knew that.)

3). The best way to initialize the fields of a superclass is to pass arguments to the constructor of the superclass. For instance:

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

The reason this approach is better is because the Loan class takes responsibility for initializing it and does not rely on the various subclass constructors to do the work. (If you add an additional field to Loan and add the appropriate parameter to the Loan constructor, the compiler reminds you to change all subclass constructors to provide an initial value in the super constructor chain. If subclasses are responsible for setting fields in the base class during initialization, then the compiler will not notice that you forgot to add a new setter call.)

4) If you call methods in the constructor, it is recommended to make sure that they cannot be overridden in a subclass. (No ... it's not entirely wrong to override methods, but there are things that can go horribly wrong. Calling potentially overridable methods in the constructor makes your code fragile.)

5) If it was a production code, using float or double to represent currency values ​​would be great, no-no! A.

+1
source

Answering question (c), I think you are getting an error because you need to determine the length there along with the variables you have already defined.

0
source

Source: https://habr.com/ru/post/1307970/


All Articles