tight encapsulation – properties (attributes)
lose coupling – relacja has-a poprzez interface a nie konkretny typ
– uwolnienie sie od szczegółów konkretnej implementacji na rzeczy interfejsów
– logikę przenosimy do interfejsu a sami wołamy tą samą metode
high cohesion – elementy są spójnie połączone pod względem np logiki, zwartość, komponent grupuje wszytskie
metody związane z konkretną funkcjonalnością.
3.2
File f1 = new File(“katalog\\pliczor1.txt”);
jesl inie ma takiego katalogu:
Exception in thread “main” java.io.IOException: The system cannot find the path specified
czyli: wcześniej musi być plik
BufferedWriter nie pozwala na podanie w konstruktorze File
musi być FileWriter
z kolei sam new FileWriter(f) rzuca IOException
drugi konstruktor: BufferedWriter(Writer fw,int bufferSize)
zeby wczytac dane z FileReader trzeba najpierw stworzyć tablice (nie moze być null)
FileReader fr.read(tablica);
metoda zwraca inta -1 jesli napotka na koniec linii
BufferedReader ma readLine()
2.4 Exception, try, catch,finally
w catch może być kolejny try catch, wtedy nazwa wyjątku w pierwszym i drugim catch muszą być inne
w catch nie może być samego innego catch
można rzucić z metody Error:
void wykonaj() throws Error {
throw new Error();
}
finally nie wykona się jeśli rzucony zostanie error który zamknie jvm
jeśli metoda rzuca Error a my łapiemy Exception to nie złapiemy, ale finally sie wykona
ogólnie errory można rzucać i łapać jak wyjątki
można też tak:
…} catch (Throwable e) {…
private static void wykonaj() throws Throwable {
throw new Throwable();
}
java.lang.Throwable extends Object implements Serializable
2.3 Assertions
metoda assert powinna być używana do walidacji argumentów metod prywatnych, nie powinna sprawdzac argumentow metod publicznych. Walidacja argumentów metod publicznych powinna działać w oparciu o IllegalArgumentException i inne wyjątki. W przypadku metod publicznych może przyjść każdy rodzaj danych. Metody prywatne zwykle spodziewają się konkretnych wartości bo wynika to z logiki biznesowej.
Asercji nie trzeba importować.
występują w dwóch wersjach: assert(expession1)
oraz assert(xpression1):expression2;
expression1 musi zwracac true or false (lub być takim obiektem lub literalem)
expression2 musi zwracać wartość, ta wartość przekazywana jest do konstruktora AssertionError a ten woła na nim
metode toString() a treść wyświetla jako detailed message.
włączenie: java -ea Main
java -enableassertions com.Main
tylko w kodzie developerskim, na produkcji sie wyłącza.
Mogą mieć dodatkowe obiążenie jesli wykonują operacje na dużej ilości elementów
debuging kodu
lepiej czytelny, lepszy maintenance
2.2
itercja standardowa:
for(int i=0;i<10;i++){ } przypisanie czyli pierwsza czesc przed srednikiem wykonuje sie tylko raz na pocztaku sprawdzenie warunku czyli w srodku pomiedzy srednikami wykonuje sie za każdym razem w iteracji az do momentu kiedy ewaluacja zwróci false, wówczas to co jest w nawiasach klamrowych pętli nie wykona sie. inkrementacja czyli trzecia częśc wykonuje sie w każdej iteracji continue wychodzi z bieżącej iteracji czyli nie robi tego co ma być robione i wchodzi do następnej break powoduje wyjście z pętli i przejście do tego co jest za pętlą return wychodzi z metody która wykonywała pętlę i wraca do miejsca gdzie metoda została wywołana(z nią,za jej wywołaniem) typ prymitywny przekazany do pętli jest zmieniany (nie przekazujemy przez wartość jak w metodach) iterujemy po 0-based indexach, dlatego maksymalny index jaki istnieje jest o jeden mniejszy od długości. dostanie się do elementu = dlugosci (pole length dla tablic i metoda size() dla kolekcji) powoduje ArrayIndexOutOfBoundsException. Tak samo próba dostania sie na negatywny index. index ma być: < tablica.length; < kolekcja.size();
2.1
switch przyjmuje arhumenty byte,short,int,char oraz ich wrapery i enumy, nie przyjmuje long, double i float
string od javie 1.7
1.5
konstruktor może mieć wszystkie modyfikatory dostępu
prywatny konstruktor w singletonie
klasa wewnętrzna może wołać prywatny konstruktor
pakietowy konstruktor może być użyty tylko z tego samego pakietu ?
domyślny bezargumentowy konstruktor ma dostęp pakietowy
z jednego konstruktora możemy wołać inny za pomocą this
za pomocą super możemy natomiast wołać superkonstruktor
każdy argumentowy konstruktor subklasy musi mieć odpowiednik w superklasie albo wołać this na przeładowanym konstruktorze odpowiadającym konstruktorowi superklasy
nie może być abstract ?
nie moze być final ?
w hierarhi sub woła super, super swojego super aż do konstruktora Object a potem wykonywanie zaczyna sie w dół
od najwyższego na najniższego czyli tego rzeczywiście wywołanego
regular inner:
Outer.Inner x = new Outer().new Inner();
z import Outer.Inner; albo: import Outer.*;
Inner x = new Outer().new Inner();
static nested:
Outer.Inner x = new Outer.Inner();
albo import Outer.*; czy import Outer.Inner; czy import static Outer.Inner; ?
filesy
File f1 = new File(“katalog\\pliczor1.txt”); jesl inie ma takiego katalogu: Exception in thread “main” java.io.IOException: The system cannot find the path specified
do InputStreamReader nie mozna przekazac File
konstruktory: InputStreamReader(InputStream is)
InputStreamReader(InputStream is,Charset c)
sam InputStream jest abstrakcyjny
tworzenie FileReader ma dwa konstruktory: przyjmujacy File i String
rzuca FileNotFoundException
Writer – podstawowe metody: write i append
tworzenie pliku rzuca IOException
FileWriter fw = new FileWriter(“pli.txt”);
BufferedWriter bw = new BufferedWriter(fw);// drugi konstruktor przyjmuje tez int jako drugi parametr:rozmiar bufora
- tworzy pusty plik
bw.write(“ksajhfkjdsalkj);
- jeszcze nie zapisuje
PrintWriter format()
print()
printf()
println()
4 konstruktory: File,String,Writer,OutputStream
Console
c.reader() zwraca Reader()
c.writer() zwraca Writer()
format()
printf()
readLine() do Stringa //wersje bezargumentowe i wielo
readPassword() zwraca tablice char[] //do formatowania
do kataloigów: mkdirs
File directory = new File(“folder/katalog”);
directory.mkdir(); //nie utworzy bo jest wiecej niz 1 katalog
System.out.println(directory.exists()); //false
trzeba uzyc mkdirs
utworzenie pliku w nieistniejacym katalogu -IOException
delete() usuwa tylko puste katalogi
renameTo(File f) – mozna zmienic nawet jak jest pełny
list() zwraca tablice plików i podkatalogów z katalogu
Obiektywy
1.1 Wewnętrzna klasa abstrakcyjna może mieć każdy modyfikator, kolejność abstract private/private abstract i inne jest dowolna.
Podobnie dla interfejsów i klas.
Klasa metody też może być abstrakcyjna ale modyfikator dostępu default jest jedynym dozwolonym
2.6 ArrayIndexOutOfBoundException – iterujemy poza najwyższy index, powinnismy do tablica.length (pole, nie metoda)
ClassCastException -
IllegalArgumentException – throw new IllegalArgumentException() ;rzucamy go sami jesli jakis warunek nie jest spełniony, sprawdzanie argumentow publicznbych metod
IllegalStateException – Signals that a method has been invoked at an illegal or inappropriate time. In other words,
the Java environment or Java application is not in an appropriate state for the requested operation.
NullPointerException
NumberFormatException – dziedziczy po IllegalArgumentException konwersja stringa na typ numeryczny ale string miał nieprawdłowy format
Integer.parseInt(“kasjd”); zwraca int Double.parseDouble(“shdk”) zwraca double
ERRORY:
AssertionError – -ea, wyłącza aplikacje
ExceptionInInitializerError – error w statycznym inicjalizatorze albo inicjalizatorze statycznej zmiennej
jest to wraper na Runtimeexceptions które moga pojawic sie w czasie inicjalizacji
Oryginalny wyjatek pojawi sie w Throwable.getCause()
error pojawi sie tylko w czasie refleksji
StackOverflowError – rozszerza VirtualMachineError, instnieje od 1.0
“Thrown when a stack overflow occurs because an application recurses too deeply”
rekurencyjne wywołanie metoda woła sama siebie
NoClassDefFoundError – rzucany przez jvm albo ClassLoader kiedy prbuje zaadowac
definicje klasy(przez new) i nie moze takiej definicji znalezc (istniaa w czasie kompilacji ale w runtime jej nie ma)
build time and runtime classpaths
do sprawdzenia:
- zmienna lokalna nie moze byc static nawet w statycznej metodzie
- dla tablic jest zmienna length a dla kolekcji size()