2013-06-19 47 views
2

我对java很陌生,为了让自己的脚稍微湿一点点我试图为我的妻子和我建立一个简单的预算程序。我有很多课,我仍然学习组织,但是我的主要问题是关于我的界面。如何实现一个接口?

它看起来像这样:

package com.budgeter; 

public interface Category { 

void setPersonalLoan(int budget); 
void setDonationsGifts(int budget); 
void setRecreation(int budget); 
void setHouseHoldItems(int budget); 
void setUtilities(int budget); 
void setSavings(int budget); 
void setGroceries(int budget); 
void setAutoInsurance(int budget); 
void setAutoPayment(int budget); 
void setHomeInsurance(int budget); 
void setHomePayment(int budget); 

} 

我不知道,如果这个接口是根据最佳实践或者不这样做,但我的目标是有办法有一组定义的类别。接下来,我有另一个类叫做BillCategory,我可以使用它来添加一个自定义类别。再次,不确定这是否是使用接口的正确方式。

所以我用这个接口是这样的:

package com.budgeter; 

public class Bills implements Category { 

private Double amount; 
private Double totalBills; 

public Bills() {} 
public Bills(double amount) { 
    setTotal(amount); 
} 

private void setTotal(Double amount) { 
    this.amount = amount; 
    totalBills = amount; 
} 

public Double getTotal() { 
    return totalBills; 
} 
@Override 
public void setPersonalLoan(int budget) { 
    // TODO Auto-generated method stub 

} 
@Override 
public void setDonationsGifts(int budget) { 
    // TODO Auto-generated method stub 

} 
@Override 
public void setRecreation(int budget) { 
    // TODO Auto-generated method stub 

} 
@Override 
public void setHouseHoldItems(int budget) { 
    // TODO Auto-generated method stub 

} 
@Override 
public void setUtilities(int budget) { 
    // TODO Auto-generated method stub 

} 
@Override 
public void setSavings(int budget) { 
    // TODO Auto-generated method stub 

} 
@Override 
public void setGroceries(int budget) { 
    // TODO Auto-generated method stub 

} 
@Override 
public void setAutoInsurance(int budget) { 
    // TODO Auto-generated method stub 

} 
@Override 
public void setAutoPayment(int budget) { 
    // TODO Auto-generated method stub 

} 
@Override 
public void setHomeInsurance(int budget) { 
    // TODO Auto-generated method stub 

} 
@Override 
public void setHomePayment(int budget) { 
    // TODO Auto-generated method stub 

} 
} 

这里是我BillCategory类,我用它来添加一个新的类别,但不完全知道如何这与我的界面:

package com.budgeter; 

import java.util.HashMap; 
import java.util.Map; 

public class BillCategory { 

private static Map<String, Integer> categories = new HashMap<String, Integer>(); 

public void addCategory(String categoryName, int frequency) { 
    categories.put(categoryName, frequency); 
} 

public Map<String, Integer> getCategories() { 
    return categories; 
} 

} 
  • 什么是最有效的方法来检查是否设置了一个项目,然后计算我所有的getTotal()方法?
  • 我是否正确使用接口?
  • 我使用了一个好的命名约定(例如Category)吗?
  • setTotalAmount()方法我不确定是否应该通过对amount的引用或将amount设置为使用this.amount = amount然后在全局范围内对其进行访问。对此有最佳做法吗?
  • 将我的BillCategory类与接口关联的最佳方式是什么?

回答

2

我建议您的界面的唯一方法是为您的方法声明添加某种可见性(public, private, protected)。在实现中你有这个,但不是在接口中。实现中的代码看起来很好,只是两个变量似乎在做同样的事情。我不知道我是否完全理解你为什么称其为Category,但是具有大写字母接口名称在java中是很好的约定。

在设置方法中,您可以完全按照您所做的操作this.amount = amount,从构造函数中调用该方法是很好的做法。

关于你的第一个问题,如果你为每个设置的方法添加一个类变量,并将该变量设置为传入的值,那么你可以在getTotal()方法中累计总数并返回该值。

private int personalLoan; 
private int donationGifts; 
private int recreation; 
private int houseHoldItems; 
... 

@Override 
public void setPersonalLoan(int budget) { 
    this.personalLoan = budget; 
} 
@Override 
public void setDonationsGifts(int budget) { 
    this.donationGifts = budget; 
} 
@Override 
public void setRecreation(int budget) { 
    this.recreation = budget; 
} 
@Override 
public void setHouseHoldItems(int budget) { 
    this.houseHoldItems = budget; 
} 
... 


public double getTotal() { 
    double total = personalLoan + donationGifts + recreation + houseHoldItems + utilities + savings + groceries.... 
    return total; 
} 

您也可以在构造函数中使用所有这些变量作为参数,并使用这些方法设置它们,而不是为您的总数取一个值。

注意我确实发现您的预算为int's,因此您的预算不能包含小数值。你可能想在你的界面中改变它,然后返回一个双倍的getTotal()更有意义。

+0

什么建议命名界面?你能给我最后一段的例子吗?非常感谢花时间解释这一点! –

+1

如果类别名称对您有意义,那么保持这种方式,只要记住接口应该是通用的并且可以多次执行。所以如果你打算使用它的另一个实现,并且Class和Bills都是一个类别,那么它就是完美的。我将在那里举出更多的代码作为最后一部分的例子。 – chancea

+0

我不确定接口的名称,因为我还有另一个名为'BillCategory'的类(未显示),我将其用于'addCategory()'。我假设'BillCategory'会是一个更好的接口名称? –