Mam taki Singleton:
import java.util.Hashtable;
public final class Cennik extends Hashtable {
private final static Cennik c = new Cennik();
private Cennik() {}
public static Cennik getCennik() {
return c;
}
public void set(String produkt, double cena) {
Hashtable<String,Double> ht = new Hashtable<String, Double>();
double d =cena;
String s = produkt;
ht.put(s, new Double(d));
}
}
Chciałabym w klasie Kasa w metodzie printBill() wypisywać ceny obiektów, ale nie wiem jak niestety.
import java.util.Vector;
class Kasa {
Koszyk k;
public void printBilll(Koszyk k) {
System.out.println("Kasa - rachunek za ["+k +"]:");
for (int i = 0; i < k.size(); i++)
System.out.println();
Skoro już roszerzasz to lepiej rozszerz HashMap i dodaj genericsy czyli zamiast "extends Hashtable" zrób "extends HashMap<String, Double>".
W metodzie set zamiast ht.put(..., ...) zrób po prostu put(..., ...) ponieważ rozszerzasz klasę która tą metodę obsługuje przecież. Nie twórz za każdym razem nowej mapy, bo nie ma po co.
Trochę nie o to mi chodziło. Przerobiłam moje klasy i mam:
import java.util.Hashtable;
public final class Cennik extends Hashtable {
Hashtable<String,Double> ht = new Hashtable<String,Double>();
private double d;
private String s;
private static Cennik c = new Cennik();
private Cennik() {}
public static Cennik getCennik() {
return c;
}
public void set(String produkt, double cena) {
d = cena;
s = produkt;
ht.put(s, new Double(d));
}
}
import java.util.Vector;
import java.util.Hashtable;
class Kasa extends Hashtable {
Koszyk k;
Hashtable ht;
public void printBilll(Koszyk k) {
System.out.println("Kasa - rachunek za ["+k +"]:");
for (int i = 0; i < k.size(); i++) {
Owoce o =(Owoce) k.get(i);
String s = o.getNazwa();
Object n = ht.get(s);
Double val = (Double) n;
double dv = val.doubleValue();
String napis = dv+ " zł/kg = ";
System.out.println(k.get(i) + " *"+napis);
}
}
}
Kompiluje się ale potem przy uruchamianiu programu głównego jest tak:
Exception in thread "main" java.lang.NullPointerException
at Kasa.printBilll(Kasa.java:11)
Po co Cennik dziedziczy po Hashtable, a potem w set do niego deleguje?
Po co Cennikowi pola d i s?
Po co Kasie pole k, skoro Koszyk podaje się jako argument printBill?
Po co Kasie pole ht, skoro dziedziczy po Hashtable?
Po co rzutować obiekty zwracane przez Hashtable.get, skoro można tą kolekcję sparametryzować?
A co do NPE, to zapewne wyrzuca go tutaj:
(bo ht tylko zadeklarowałaś i wciąż jest nullem)
Ale trzeba to jeszcze czymś wypełnić. Ja naprawdę nie mam pojęcia, do czego to ma służyć. Co się tobie nie podoba w kodzie donkeya?
To się wypełnia w klasie głównej przy pomocy metody set (jest w Cenniku)
public void set(String produkt, double cena) {
ht.put(produkt, new Double(cena));
Obiekty tworzą tablicę (przy pomocy klasy Vector z java.util) i teraz chcę z tej tablicy wydostać dla każdego obiektu wartość double metodą z Hashtable get().