2013-06-19 1 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()?
  • Я правильно использую интерфейс?
  • Я использую хорошее соглашение об именах (например, категория)?
  • Метод 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

Если название категории имеет смысл для вас, то сохраняйте его таким образом, просто помните, что интерфейсы должны быть универсальными и реализовываться несколько раз. Поэтому, если вы собираетесь использовать другую реализацию, и оба класса и векселя являются одновременно категориями, то они отлично работают. Я приведу еще один код для примера последней части. – chancea

+0

Я не был уверен, что назвать интерфейс, так как у меня также есть другой класс (не показан) с именем 'BillCategory', который я использую для' addCategory() '. Я полагаю, что 'BillCategory' будет лучшим именем для интерфейса? –

 Смежные вопросы

  • Нет связанных вопросов^_^