====== 2 - Paměť v objektově-orientovaných jazycích ======
1. domácí úkol (do 18. 10. 2016) - [[http://omo.squeezer.felk.cvut.cz/hwzadani/|zadání]]
Prostudujte si [[https://sites.google.com/a/fel.cvut.cz/gitlab-informace/|návod]] pro práci se systémem Gitlab a [[https://try.github.io|tutoriál]] základních příkazů gitu.
===== Úloha na cvičení - opakování objektového návrhu =====
* Dostali jste zakázku na implementaci pokladního systému zverimexu.
* Jsou dána následující rozhraní
public interface Ocenitelny {
public int getCena();
}
public interface Vazitelny {
public int getVaha();
}
- Implementujte pomocí výčtového typu (enum) vlastní datové typy **Barva** a **Pohlavi**.
- Implementujte třídu reprezentující **křečka** s vlastnostmi **barva, pohlaví, cena, váha**.
- Cvičně můžete vytvořit další typy prodávaných zvířat. U všech zajistěte informaci o ceně a váze pomocí výše uvedených **rozhraní**.
- Implementujte třídu reprezentující nákupní **košík** s možnostmi **přidání položky** a **získání celkové ceny zboží**.
- Ověřte funkčnost jednoduchým programem.
**Výčtový typ (enum)**
Výčtový typ definuje množinu konstant. V Javě enum dovoluje použití atributů a metod. Všechny výčtové typy implicitně dědí z [[https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html|java.lang.Enum]] (proto ani nemohou dědit z ničeho jiného).
Konstruktor musí být privátní. Slouží k vytváření definovaných konstant. Konstruktor nemůžeme zavolat explicitně.
Enum v Javě navíc poskytuje speciální metody. Například statická metoda ''values'' vrací pole všech hodnot daného výčtového typu. Toto se hodí pro použití ve [[http://docs.oracle.com/javase/1.5.0/docs/guide/language/foreach.html|for-each]] cyklu.
public enum Color {
RED("červená"),GREEN("zelená"),BLUE("modrá");
private final String localizedValue;
private Color(String localizedValue)
{
this.localizedValue = localizedValue;
}
public String getLocalizedValue()
{
return localizedValue;
}
@Override
public String toString()
{
return localizedValue;
}
public static void main(String[] args) {
for(Color c : Color.values())
{
System.out.print(c + ",");
}
System.out.println();
}
}
===== Úloha na cvičení - krokování programu a stav paměti =====
- Odkrokujte následující program a s použitím notace z přednášky popište stav paměti v místech označených komentáři (stavy 1-9)
public class Main {
public int f(int x) {
//2,3,4,5
if (x <= 0) {
return 0;
}
int y = x + f(x - 1);
//6,7,8
return y;
}
public static void main(String[] args) {
Main main = new Main();
//1
int y = main.f(3);
//9
System.out.println(y);
}
}
- Odkrokujte následující program a s použitím notace z přednášky popište stav paměti v místech označených komentáři (stavy 1-6).\\ Diskutujte rozdíl oproti předchozímu programu.
public class Main {
public int f2(int x) {
int y = 0;
int i = 1;
while (i <= x) {
//2,3,4
y += i;
i++;
}
//5
return y;
}
public static void main(String[] args) {
Main main = new Main();
//1
int y = main.f2(3);
//6
System.out.println(y);
}
}
- Odkrokujte následující program a s použitím notace z přednášky popište stav paměti v místech označených komentáři (stavy A, B a C). Předpokládejte, že typ double má neomezenou přesnost a že garbage collector odstraní z haldy alokované instance okamžitě poté, co přestanou být z programu dostupné.
class Vector {
final double x, y;
private static Vector testVector = null;
Vector(double x, double y) {
this.x = x;
this.y = y;
// stav B
}
double getX() {
return x;
}
double getY() {
return y;
}
static Vector testVector() {
// stav A
if (testVector == null) testVector = new Vector(1.0, 0.0);
return testVector;
}
Vector funcionMagica() {
double[] a = {1.0, 0.5, -1.0, -1.0};
Vector v = this;
for (double d : a) v = new Vector(Math.sin(Math.PI * d),
Math.cos(Math.PI * d));
return v;
}
public static void main(String[] args) {
Vector v = Vector.testVector();
double k = v.getY() / v.getX();
Vector v2 = v.funcionMagica();
// stav C
}
}