Vnořené třídy
- zatím: třída v samostatném souboru
- pro krátké třídy použité jen na jednom místě zbytečné
public class Vnejsi {
private static class Vnitrni {
/* ... */
}
public static void main(String[] args) {
Vnitrni a = new Vnitrni();
}
}
Rozhraní (interface)
- koncept skrytí implementace, vidíme jen vnější chování
-
chci něco, do čeho můžu zapsat výsledek
- v ten okamžik mě nezajímá, kam se výsledek zapíše
- disk, obrazovka, síť, ...
- ani jak je to udělané
- kde je ten soubor, jestli je to přes TCP nebo UDP, ...
-
metoda chce něco, co umí zapsat výsledek
- programátor té metody neví, kam to bude
- při volání se rozhodnu, kam se to zapíše
- definuje protokol chování
- jen seznam metod, bez implementace
- příklad je odvozen od příkladu na převod do šedivé
public class UpravaBarev {
private static interface Prevod {
public awh.Color preved(awh.Color vstup);
}
private static class Sediva implements Prevod {
public awh.Color preved(awh.Color vstup) {
int sediva = (int)(
0.299 * vstup.getRed()
+ 0.587 * vstup.getGreen()
+ 0.114 * vstup.getBlue()
);
return awh.Color.fromRgb(sediva, sediva, sediva);
}
}
private static class Zesvetleni implements Prevod {
private final double pomer;
public Zesvetleni(double pomer) {
this.pomer = pomer;
}
private int slozka(int a) {
long nova = Math.round(pomer * a);
if (nova < 0) {
return 0;
} else if (nova > 255) {
return 255;
} else {
return (int) nova;
}
}
public awh.Color preved(awh.Color vstup) {
return awh.Color.fromRgb(
slozka(vstup.getRed()),
slozka(vstup.getGreen()),
slozka(vstup.getBlue())
);
}
}
private static void prevedVsechnyPixely(awh.Image obr, Prevod prevod) {
int sirka = obr.getWidth();
int vyska = obr.getHeight();
for (int y = 0; y < vyska; y++) {
for (int x = 0; x < sirka; x++) {
awh.Color puvodni = obr.getPixel(x, y);
awh.Color nova = prevod.preved(puvodni);
obr.setPixel(x, y, nova);
}
}
}
public static void main(String[] args) {
String typ = args[0];
Prevod prevod;
if (typ.equals("sediva")) {
prevod = new Sediva();
} else if (typ.equals("svetlo")) {
prevod = new Zesvetleni(2.0);
} else if (typ.equals("tma")) {
prevod = new Zesvetleni(0.5);
} else {
awh.Sys.die("Neznamy prevod.");
return;
}
awh.Image obr = awh.Image.loadFromFile(args[1]);
prevedVsechnyPixely(obr, prevod);
obr.saveToFile(args[2]);
}
}