我有一个贷款类,在其printPayment方法中,它打印贷款的摊销表以进行新的分配。我们还将实施打印首次付款方式和打印最后付款方式。由于我的计算是在printPayment方法中完成的,所以我不知道如何在循环的第一次或最后一次迭代中获取值并打印出该数量。
我能想到的一种方法是编写一个可能返回该值的新方法,但我不确定是否有更好的方法。这是我的代码:
public abstract class Loan
{
public void setClient(Person client)
{
this.client = client;
}
public Person getClient()
{
return client;
}
public void setLoanId()
{
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()
{
return loanAmount;
}
public void printPayments()
{
double monthlyInterest;
double monthlyPrincipalPaid;
double newPrincipal;
int paymentNumber = 1;
double monthlyInterestRate = interestRate / 1200;
double monthlyPayment = loanAmount * (monthlyInterestRate) /
(1 - Math.pow((1 + monthlyInterestRate),( -1 * loanLength)));
System.out.println("Payment Number | Interest | Principal | Loan Balance");
// amortization table
while (loanAmount >= 0) {
monthlyInterest = loanAmount * monthlyInterestRate;
monthlyPrincipalPaid = monthlyPayment - monthlyInterest;
newPrincipal = loanAmount - monthlyPrincipalPaid;
loanAmount = newPrincipal;
System.out.printf("%d, %.2f, %.2f, %.2f", paymentNumber++, monthlyInterest, monthlyPrincipalPaid, loanAmount);
}
}
/*
//method to print first payment
public double getFirstPayment()
{
}
method to print last payment
public double getLastPayment()
{
}*/
private Person client;
private int loanId;
private double interestRate;
private int loanLength;
private double loanAmount;
private static int nextId = 1;
}
谢谢!
答案 0 :(得分:4)
您已经确定printPayments()
,printFirstPayment()
和printLastPayment()
方法具有相同的逻辑。您通常希望尽量减少此类代码的重复,执行此操作的两种常用方法是:
根据其中一个方法实施除一个方法之外的所有方法;或
根据私有方法实现所有方法。
所以,例如:
public void printPayments() {
for (Payment : getPayments()) {
printPayment(payment);
}
}
public void printFirstPayment() {
printPayment(getPayments().get(0));
}
public void printLastPayment() {
List<Payment> payments = getPayments();
printPayment(payments.get(payments.size()-1));
}
private void printPayment(Payment payment) {
...
}
private List<Payment> getPayments() {
...
}
现在这是作业,所以你可能还没有遇到过语法List<Payment>
。如果没有,那就是泛型。还有其他方法可以执行此操作:例如,使用非泛型Collection
或使用数组。
我想在这里说明的要点是:
创建付款并显示付款的逻辑已经分开;
单个方法getPayments()
执行计算并返回List
个Payment
个对象。 Payment
是此模拟中的新对象;
这三种方法都是根据getPayments()
和printPayment()
实施的。
所以我希望这会引导你朝着正确的方向前进。我想这里的概念是功能组合,根据其他功能组合你的功能,使你的内部功能足够精细,可以有效地组合在一起。
答案 1 :(得分:1)
您的printPayments功能非常大。通常最好使每个功能“做好一件事”,并使功能相对较短。我建议你将计算逻辑与打印逻辑分开;提供计算这些不同支付的功能,并使您的打印功能仅打印调用这些计算功能的结果。
如果您担心冗余(这是后期计算的某些依赖于您之前可能执行的早期计算),那么您可以使用动态编程,这基本上意味着您将先前的结果累积在数组或矩阵中它们可以在后续计算中重用。您可以将整个摊销表计算为二维数组,在这种情况下,您可以通过在该数组中查找它们来查找您计算的早期付款。
答案 2 :(得分:0)
也许你应该有一个方法返回一个数组/ set / list / resultset / datacontainer(添加更多流行语来混淆你 - 毕竟它是你的作业;))你可以在其他方法。
答案 3 :(得分:0)
如果你描述一个方法的作用,你会使用'和'这个词,很可能这个方法做得太多了。每个方法都应该做一件事,所以打印是一回事,计算是另一回事。所以两种方法。