Metoda setImie();

0

To są moje początki z javą i dla utrwalenia staram sie napisać prosty programik do zapisywania zamówień klienta do pliku tekstowego.

Wszystko działa gdy w kodzie źródłowym zdefiniuje całe zamówienie (imie, nazwisko, it.), jednak chciałbym napisać metodę do wprowadzania z klawiatury tych składowych zamówienia, ale mam z tym pewien problem.

Kod wygląda tak:

 
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.*;

class Zamowienie {
	Scanner in = new Scanner(System.in);
	
	public Zamowienie() {

	}

	public Zamowienie(String aImie, String aNazwisko, String aAdres, String aCzesc1) {
		Imie = aImie;
		Nazwisko = aNazwisko;
		Adres = aAdres;
		Czesc1 = aCzesc1;
		CzasZamowienia = new Date();
	}
	
	public Zamowienie(String aImie, String aNazwisko, String aAdres, String aCzesc1, String sCzesc2) {
		Imie = aImie;
		Nazwisko = aNazwisko;
		Adres = aAdres;
		Czesc1 = aCzesc1;
		Czesc2 = sCzesc2;
		CzasZamowienia = new Date();
	}
	
	public Zamowienie(String aImie, String aNazwisko, String aAdres, String aCzesc1, String sCzesc2, String aCzesc3) {
		Imie = aImie;
		Nazwisko = aNazwisko;
		Adres = aAdres;
		Czesc1 = aCzesc1;
		Czesc2 = sCzesc2;
		Czesc3 = aCzesc3;
		CzasZamowienia = new Date();
	}
	
	public String getImie(){
		return Imie;
	}
	
	public String getNazwisko(){
		return Nazwisko;
	}
	
	public String getAdres(){
		return Adres;
	}
		
	public String getCzesci(){
		Czesci = Czesc1+" "+Czesc2+" "+Czesc3;
		return Czesci;
	}
	
	public String getDate(){
		SimpleDateFormat sdf = new SimpleDateFormat(FORMAT_DATE);
		return sdf.format(CzasZamowienia);
	}
	
	public void zapis(String aZamowienie)throws FileNotFoundException {
		zamowienie = aZamowienie;
		PrintWriter out = new PrintWriter("zamowienie.txt");
		out.println(zamowienie);
		out.close();
	}
	
	public void setImie(){
		Imie = in.nextLine();		
	}
	

	private String Imie = "";
	private String Nazwisko = "";
	private String Adres = "";
	private String Czesci = "";
	private String Czesc1 = "";
	private String Czesc2 = "";
	private String Czesc3 = "";
	private Date CzasZamowienia;
	private String FORMAT_DATE = "dd MMMM yyyy";
	private String zamowienie;
}
import java.io.FileNotFoundException;

public class Test {

	public static void main(String[] args)throws FileNotFoundException{
		Zamowienie z = new Zamowienie("Jan", "Kowalski",
				"Ćwiartki 3/4", "opona", "felga");
		
		
		String zamowienie = (z.getImie()+" "+z.getNazwisko()+"\nAdres: "+z.getAdres()+"\nSkladniki: "+z.getCzesci()+"\nCzas zamówienia: "+z.getDate());
		z.zapis(zamowienie);		
		System.out.println(zamowienie);		
	}
}

Na końcu klasy Zamówienie jest właśnie ta moja nieszczęsna metoda setImie, z którą mam problem. Kompletnie nie miałem pomysłu jak sie za to zabrać, zdaje sobie sprawę, że to co napisałem może być kompletną głupotą, ale cóż... nic innego nie mogłem wymyślić.

Jak wywołuje ją w konstruktorze w taki sposób:

Zamowienie z = new Zamowienie("z.setImie(), "Kowalski",
				"Ćwiartki 3/4", "opona", "felga"); 

to dostaje błąd, że dane musza być w formie (String, String, ...) i wcale sie temu nie dziwie. Jak to ugryźć?

I jeszcze jedno, dlaczego w FORMAT_DATE nie mogę dodać godzin, minut, sekund? Jak ustawiałem na bodajże "IS" to dostawałem błąd.

ps. byłbym wdzięczny za wszystkie krytyczne komentarze dotyczące składni kodu, organizacji całego programu, itp.

0

A kolorowanie składni ci nic a nic nie mówi ?

0

Jeżeli chodzi o "z.setImie() to ten " tylko przez pomyłke przy pisaniu tematu wlazł.

1

W poleceniu:
Zamowienie z = new Zamowienie(z.setImie(),"Kowalski","Ćwiartki 3/4","opona","felga");
z.setImie() musi się wywołać wcześniej niż wywoła się konstruktor, poza tym konstruktor oczekuje string'a a setImie zwraca void.
więc, albo:
Zamowienie z = new Zamowienie("","Kowalski","Ćwiartki 3/4","opona","felga");
z.setImie();
albo zmienić setImie na:
public static String setImie(){
return in.nextLine();
}
a wywoływać:
Zamowienie z = new Zamowienie(Zamowienie::setImie(),"Kowalski","Ćwiartki 3/4","opona","felga");

1

Metoda setImie() w ogóle w klasie Zamowienie nie powinna istnieć (tak samo zresztą jak zapis, ale nie o tym). Obiekt tego typu powinien tylko przechowywać dane - tym, skąd je wczytywać i gdzie zapisywać, powinna zajmować się całkiem inna warstwa.
To znaczy, zrób normalny setter i z zewnątrz wywołuj nextLine():

class Zamowienie {
    // ...

    public void setImie(String imie){
        Imie = imie;
    }
}

Zamowienie z = new Zamowienie(null, "Kowalski", "Ćwiartki 3/4", "opona", "felga");
Scanner scanner = new Scanner(System.in);
z.setImie(scanner.nextLine());

Btw, masz dużo powtarzania się kodu w konstruktorach:

public Zamowienie(String aImie, String aNazwisko, String aAdres, String aCzesc1) {
    Imie = aImie;
    Nazwisko = aNazwisko;
    Adres = aAdres;
    Czesc1 = aCzesc1;
    CzasZamowienia = new Date();
}
 
public Zamowienie(String aImie, String aNazwisko, String aAdres, String aCzesc1, String sCzesc2) {
    this(aImie, aNazwisko, aAdres, aCzesc1);
    Czesc2 = sCzesc2;
}
 
public Zamowienie(String aImie, String aNazwisko, String aAdres, String aCzesc1, String sCzesc2, String aCzesc3) {
    this(aImie, aNazwisko, aAdres, aCzesc1, sCzesc2);
    Czesc3 = aCzesc3;
}

Dalej - konwencja nazewnicza dla pól i metod to lowerCamelCase: imie, nazwisko, czasZamowienia (nie CzasZamowienia).
Bez sensu, że konstruktory są publiczne, a sama klasa pakietowa: dodaj public class Zamowienie.

Zerknij: http://download.oracle.com/javase/6/docs/api/
Nie ma tam nawet wzorca dla litery I, spróbuj dd MMMM yyyy HH:mm:ss.

0
iooi napisał(a)

Metoda setImie() w ogóle w klasie Zamowienie nie powinna istnieć (tak samo zresztą jak zapis, ale nie o tym).

Czyli to ma znajdować sie w klasie Test, czy w oddzielnej klasie?

1
Zamowienie z = new Zamowienie(null, "Kowalski", "Ćwiartki 3/4", "opona", "felga");
Scanner scanner = new Scanner(System.in);
z.setImie(scanner.nextLine());

To powinno znajdować się w klasie Test. Dodatkową zaletą jest to, że Scanner tworzysz tylko raz (a nie z każdym utworzeniem obiektu). Potem wystarczy robić:

Zamowienie z2 = new Zamowienie(null, "Kowalski2", "Ćwiartki 2/4", "opona2", "felga2");
z2.setImie(scanner.nextLine());
Zamowienie z3 = new Zamowienie(null, "Kowalski3", "Ćwiartki 1/4", "opona3", "felga3");
z2.setImie(scanner.nextLine());

//
A nawet nie potrzebujesz settera, jeśli imię ustawiasz od razu. Wystarczy:

Zamowienie z = new Zamowienie(scanner.nextLine(), "Kowalski", "Ćwiartki 3/4", "opona", "felga");
Zamowienie z2 = new Zamowienie(scanner.nextLine(), "Kowalski2", "Ćwiartki 2/4", "opona2", "felga2");
Zamowienie z3 = new Zamowienie(scanner.nextLine(), "Kowalski3", "Ćwiartki 1/4", "opona3", "felga3");

1 użytkowników online, w tym zalogowanych: 0, gości: 1