Як павялічыць элемент поля ў класе Java кожны раз, калі новы адзін асобнік

ВЕЛЬМІ пачатковец у Java, так што я адчуваю сябе, як дзіця прама цяпер. Радасці вывучэння новага мовы, я думаю.

Вось мой клас Лік:

public class Invoice {
//member inits
private int numberOfInvoices = 0;
private String companyName;
private double amountDue;
private String chargeDate;
private static int invoiceNumber = 0;


//constructor
public Invoice(String _companyName, double _amountDue, String _chargeDate)
{
    numberOfInvoices++;
    companyName = _companyName;
    amountDue = _amountDue;
    chargeDate = _chargeDate;
    invoiceNumber = numberOfInvoices;
}

//getters
public String getCompanyName()
{
    return companyName;
}

public double getAmountDue()
{
    return amountDue;
}

public String getChargeDate()
{
    return chargeDate;
}

public int getInvoiceNumber()
{
    invoiceNumber = numberOfInvoices + 1;
    return invoiceNumber;
}

//setters
public void setCompanyName(String _companyName)
{
    companyName = _companyName;
}

public void setAmountDue(double _amountDue)
{
    amountDue = _amountDue;
}

public void setChargeDate(String _chargeDate)
{
    chargeDate = _chargeDate;
}
//helpers
public int incrementInvoices()
{
    return numberOfInvoices++;
}
}

А вось галоўны метад, дзе я спрабую стварыць тры з гэтых рахункаў-фактур, але павялічваем нумар рахунку кожны раз, калі ствараецца новы.

public class InvoiceCreator {

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    Invoice invoice1 = new Invoice("Amazing Software", 5000.00, "January 18, 2009");
    System.out.println(invoice1);

    Invoice invoice2 = new Invoice("Best Programs", 4000.00, "February 18, 2009");
    System.out.println(invoice2);

    Invoice invoice3 = new Invoice("Champion Code", 3000.00, "March 18, 2009");
    System.out.println(invoice3);
}
}

Я таксама пачатковец у IDE (Netbeans), але праз адладку і глядзіце на кожнага з класаў, якія я стварыў, усе палі ініцыялізуюцца правільна, але INVOICENUMBER = 1 на кожным з іх.

Што я раблю няправільна тут?

3

9 адказы

Вы павінны выкарыстоўваць статычнае поле для генерацыі дадатковых нумары рахункаў-фактур, а не захоўваць асобныя нумары рахункаў-фактур.

Паспрабуйце гэта:

public class Invoice {
//member inits
private static int nextInvoiceNumber = 0;
private String companyName;
private double amountDue;
private String chargeDate;
private int invoiceNumber = 0;


//constructor
public Invoice(String _companyName, double _amountDue, String _chargeDate)
{
    invoiceNumber = nextInvoiceNumber;
    nextInvoiceNumber++;
    companyName = _companyName;
    amountDue = _amountDue;
    chargeDate = _chargeDate;

}
....
4
дададзена
Вы пампуеце, што зрабіў трук! Дзякуй усім, хоць, 9 адказаў менш чым за 10 хвілін .. Шкада, што я мог бы атрымаць гэты від Lovin 'на маіх праблемах, звязаных з C #!
дададзена аўтар ledgeJumper, крыніца

Аб'яўляе numberOfInvoices быць статычная , так што ёсць толькі адно значэнне для ўсяго класа, а не асобнае значэнне для кожнага асобніка.

 private static int numberOfInvoices = 0;
2
дададзена

Вы абвясцілі INVOICENUMBER , як статычныя, але numberOfInvoices не з'яўляецца статычным. У канструктару вы павялічваецца колькасць рахункаў - якія, быўшы не статычную, ініцыялізуюцца 0 кожны раз, калі вы ствараеце асобнік гэтага. Затым вы прызначаеце гэта значэнне на свой нумар рахункі-фактуры.

Простае выпраўленне для вашага выпадку, каб абвясціць numberOfInvoices як статычныя і INVOICENUMBER як ня статычныя:

private static int numberOfInvoices = 0;
private int invoiceNumber;

то вы атрымаеце жаданае паводзіны.

У той жа час, варта адзначыць, што гэтая рэалізацыя ў парадку з мэтай вывучэння мовы, аднак ён не будзе працаваць для вытворчай сістэмы, так як лік яшчэ будзе скінуты ў 0, калі праграма завяршае працу і перазапускаецца. У вытворчай сістэме, вы хацелі б захаваць гэты нумар у базе дадзеных або знешні файл дзе-небудзь. Затым трэба будзе, каб пераканацца, што ён павялічваецца ў струменева-чынам. У вытворчай сістэме, ваша логіка будзе нешта накшталт гэтага:

private int invoiceNumber;
private Object sync;

public Invoice(...) {
    synchronised(sync) {
        invoiceNumber = loadLastInvoiceNumberFromStorage();
        invoiceNumber++;
        writeLastInvoiceNumberFromStorage(invoiceNumber);
    }

    ...
}
1
дададзена

numberOfInvoices should be static. invoiceNumber should not be static. And you should synchronize the access to this field. See also: What is the best way to increase number of locks?

1
дададзена

выкарыстанне

private static int numberOfInvoices = 0;

<�Моцны> Прычына:

Статычныя зменныя ставяцца да класа, а нестатические зменныя звязаны аб'екта. Як і ў гэтым выпадку вы захоўваеце лічыльнік аб'екта класа, так што гэта звязана з класам. Такім чынам, вы павінны захоўваць яго ў якасці статычнай зменнай (таксама называецца пераменная класа)

For more details see here

0
дададзена

Вы можаце выкарыстоўваць статычнае поле numberOfInvoices у сваім класе, і павялічваць яго ў канструктару. Тады вы маглі б мець статычны паглынальнік для поля.

0
дададзена

numberOfInvoices isn't the static member.

Вы ў цяперашні час павялічвае элемент <�асобнік эм /> ўласцівасць і ўсталяваць яго на статычнае ўласцівасць.

Я падазраю, што вы хочаце, наадварот.

0
дададзена

numberOfInvoices заўсёды будзе 0, калі ствараецца новы аб'ект. Такім чынам, кожны раз, калі вы павялічыць яго і прысвоіць яго INVOICENUMBER, INVOICENUMBER атрымлівае значэнне 1. Замест гэтага, чаму б вам наўпрост павялічвае INVOICENUMBER.

0
дададзена

Вы павінны абвясьціць элемент numberOfInvoices як статычны член:

private static int numberOfInvoices = 0;

Такім чынам, усе асобнік рахункі-фактуры будзе падзяляць гэты элемент. Калі вы не аб'яўляеце яго кожны асобнік рахункі-фактуры будзе мець сваё ўласнае значэнне.

0
дададзена