Java 如何实现接口?

Java 如何实现接口?,java,interface,code-organization,Java,Interface,Code Organization,我对java非常陌生,为了让我的脚有点湿,我正在尝试为我和我的妻子建立一个简单的预算计划。我有相当多的类,我仍在学习组织这些类,但我的主要问题是关于我的接口 看起来是这样的: package com.budgeter; public interface Category { void setPersonalLoan(int budget); void setDonationsGifts(int budget); void setRecreation(int budget); void set

我对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

}
}
下面是我的
billcegory
类,我用它来添加一个新的类别,但不完全确定如何将它与我的界面关联起来:

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

}
package com.budgeter;
导入java.util.HashMap;
导入java.util.Map;
公共类BillCategory{
私有静态映射类别=新HashMap();
public void addCategory(字符串categoryName,int-frequency){
类别。put(类别名称、频率);
}
公共地图getCategories(){
退货类别;
}
}
  • 对于我的
    getTotal()
    方法,检查项目是否已设置,然后计算所有项目的最有效方法是什么
  • 我是否正确使用接口
  • 我是否使用了良好的命名约定(例如类别)
  • setTotalAmount()
    方法我不确定是否应该传递对
    amount
    的引用,或者使用
    this.amount=amount
    设置
    amount
    ,然后全局访问它。这方面有最佳实践吗
  • 将我的
    BillCategory
    类与接口关联的最佳方式是什么

我唯一建议您的接口是在方法声明中添加某种可见性
(公共、私有、受保护)
。在实现中有,但在接口中没有。实现中的代码看起来不错,只是两个变量似乎在做相同的事情。我不知道我是否完全理解您为什么称它为Category,但在java中,使用大写接口名是一种很好的约定

在set方法中,您可以完全按照您所做的操作执行。amount=amount,从构造函数调用该方法是一种很好的做法

关于第一个问题,如果您为每个set方法添加一个类变量,并将该变量设置为传入的值,那么您可以在
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的
,因此您的预算不能有十进制值。您可能希望在接口中更改该值,然后为
getTotal()
返回一个double更有意义

建议如何命名接口?最后一段你能给我举个例子吗?非常感谢您花时间解释这一点!如果类别名称对您有意义,那么请保持这种方式,只需记住接口应该是泛型的并实现多次。因此,如果您打算使用它的另一个实现,并且该类和Bills都是一个类别,那么它工作得非常完美。我将在上面抛出一些代码作为最后一部分的示例。我不确定该接口的名称,因为我还有另一个名为
billcegory
的类(未显示),用于
addCategory()
。我想
BillCategory
会是界面的更好名称吗?嗯。。。我想我也可以创建一个映射,将int值添加到映射中,然后通过循环对映射的值进行合计。我不完全确定BillCategory类是如何工作的,但仅供参考,您可以创建一个类似于
Map
Map
,然后可以调用
.put(“key”,bills)
或地图中类别的任何其他实现,并通过键检索它们。