Commit d62582e3 authored by Jostein Hjortland Tysse's avatar Jostein Hjortland Tysse
Browse files
parents 9ca48b27 036b0ac6
package uke13.arv;
public class UnderstandEquals {
String streng;
public UnderstandEquals(String ting) {
this.streng = ting;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((streng == null) ? 0 : streng.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
UnderstandEquals other = (UnderstandEquals) obj;
if (streng == null) {
if (other.streng != null)
return false;
} else if (!streng.equals(other.streng))
return false;
return true;
}
public static void main(String[] args) {
// Kommentarer for utvidelse nederst
String s1 = new String("Hallo");
String s2 = new String("Hallo");
System.out.println(s1.equals(s2));
UnderstandEquals u1 = new UnderstandEquals("Hallo");
UnderstandEquals u2 = new UnderstandEquals("Hallo");
System.out.println(u1.equals(u2));
System.out.println(u1);
System.out.println(u2);
// Hva skjer hvis jeg lar editoren automatisk lage equals og hashcode?
// Hva skjer hvis jeg overskriver toString?
}
}
package uke13.arv.bok;
public class Bok {
private String tittel;
private String specialCharacters = " -,.%";
public Bok() {
}
public Bok(String tittel) {
setTittel(tittel);
}
public String getTittel() {
return tittel;
}
protected String getToStringAttributes() {
return "tittel=" + tittel; }
@Override
public String toString() {
return getToStringAttributes();
}
public void setTittel(String tittel) {
if (!isValidTittel(tittel)) {
throw new IllegalArgumentException(tittel+" er ikke en gyldig boktittel.");
}
this.tittel = tittel;
}
public boolean isValidTittel(String tittel) {
// System.out.println("Bok.isValidTittel");
for (int i = 0; i < tittel.length(); i++) {
char c = tittel.charAt(i);
if (! (Character.isLetter(c) || Character.isDigit(c) ||
specialCharacters.indexOf(c) >= 0)) {
return false;
}
}
return true;
}
public static void main(String[] args) {
Bok bok = new Bok("Titten tei på eventyr");
System.out.println(bok);
Bok ordbok = new Ordbok("Engelsk-norsk ordbok", 33);
Bok tegneseriealbum = new Tegneseriealbum("Asterix og romerne", 43);
// Vi kan ikke kalle tegneseriealbum.getAntallStriper, men siden toString kaller
// toString overskygget i Tegneseriealbum vises det allikevel:
System.out.println(tegneseriealbum);
// Arv arver også hva de er er:
System.out.println("ordbok er en Bok: "+(ordbok instanceof Bok));
System.out.println("ordbok er en Ordbok: "+(ordbok instanceof Ordbok));
System.out.println("ordbok er classen Bok: "+(ordbok.getClass() == Bok.class));
System.out.println("ordbok er classen Ordbok: "+(ordbok.getClass() == Ordbok.class));
// Sjekk av tittel i setTitle, som kalles i konstruktøren
// Bok bok2 = new Bok("Hei{");
// System.out.println(bok2); // Vil utløse unntak
// For isValidTitle()
// Bok bok3 = new Bok("Titten tei på eventyr");
// System.out.println(bok3);
// Substitusjonsprinsippet:
// Bok bok4 = new Ordbok();
// bok.setTittel("Egentlig ikke noen ordbok");
// System.out.println(bok4.toString()); // Hva skjer her?
// Bok bok5 = new Ordbok("Ikke ordbok", 234);
// System.out.println(bok5.toString()); // Hva skjer her?
}
}
package uke13.arv.bok;
public class Ordbok extends Bok{
int antallOrd;
public Ordbok() {
super();
}
public Ordbok(String tittel, int antallOrd) {
super(tittel);
this.antallOrd = antallOrd;
}
public void setAntallOrd(int antallOrd) {
this.antallOrd = antallOrd;
}
public int getAntallOrd() {
return antallOrd;
}
// Skygger over Bok.getToStringAttributes(), men bruker den!
protected String getToStringAttributes() {
return super.getToStringAttributes() + ", antallOrd=" + antallOrd;
}
public static void main(String[] args) {
Bok bok = new
Bok bok = new Ordbok();
bok.setTittel("Lawrence of Arabia");
System.out.println(bok);
Ordbok ordbok = new Ordbok("Nynorsk ordbok", 654);
System.out.println(ordbok);
}
}
package uke13.arv.bok;
public class Tegneseriealbum extends Bok {
int antallStriper;
public Tegneseriealbum(String tittel, int antallStriper) {
super(tittel); // Merk at vi bruker Bok sin konstruktør, for å sjekke tittelkorrekthet
this.antallStriper = antallStriper;
}
public int getAntallStriper() {
return antallStriper;
}
// Denne kalles når en Bok kalles med toString().
protected String getToStringAttributes() {
return super.getToStringAttributes() + ", antallStriper=" + antallStriper;
}
public void setAntallStriper(int antallStriper) {
this.antallStriper = antallStriper;
}
}
package uke13.arv.bok_avansert;
public class Bok {
private String tittel;
private String specialCharacters = " -,.%";
private String ulovligeBokstaver = "#¤([]){]}";
@Override
public String toString() {
// Den første skriver bare ut for bok. Men dersom du lager en
// ny metode, kaller den, og den kan skygges over av subklasser,
// da kan en ende opp med en fin løsning. Når du kaller toString
// på en Ordbok vil den ende opp i Bok.toString() siden Ordbok ikke
// implementerer denne. Kallet vil allikevel rutes tilbake til
// Ordbok.GetToStringAttributes()!
// return "Bok [tittel=" + tittel + "]";
return GetToStringAttributes();
}
protected String GetToStringAttributes() {
return "tittel=" + tittel; }
public Bok() {
super();
}
public Bok(String tittel) {
setTittel(tittel);
}
public String getTittel() {
return tittel;
}
public void setTittel(String tittel) {
if (!isValidTitle(tittel)) {
throw new IllegalArgumentException(tittel+" er ikke en gyldig boktittel.");
}
this.tittel = tittel;
}
public boolean isValidTitle(String tittel) {
// System.out.println("Bok.isValidTittel");
for (int i = 0; i < tittel.length(); i++) {
char c = tittel.charAt(i);
if (! (Character.isLetter(c) || Character.isDigit(c) ||
specialCharacters.indexOf(c) >= 0)) {
return false;
}
}
return true;
}
public static void main(String[] args) {
Bok bok = new Bok("Titten tei på eventyr");
System.out.println(bok);
// Sjekk av tittel i setTitle, som kalles i konstruktøren
// Bok bok2 = new Bok("Hei{");
// System.out.println(bok2); // Vil bli null
// For isValidTitle()
Bok bok3 = new Bok("Titten tei på eventyr");
System.out.println(bok3);
Bok ordbok = new Ordbok("Engelsk-norsk ordbok", 33);
Bok tegneseriealbum = new Tegneseriealbum("Asterix og romerne", 43);
// Vi kan ikke kalle tegneseriealbum.getAntallStriper, men siden toString kaller
// toString overskygget i Tegneseriealbum vises det allikevel:
System.out.println(tegneseriealbum);
}
}
package uke13.arv.bok_avansert;
public class Ordbok extends Bok {
int antallOrd;
public Ordbok(String tittel, int antallOrd) {
super(tittel); // Merk at vi bruker Bok sin konstruktør, for å sjekke tittelkorrekthet
this.antallOrd = antallOrd;
}
public int getAntallOrd() {
return antallOrd;
}
public void setAntallOrd(int antallOrd) {
this.antallOrd = antallOrd;
}
public void setTittel(String tittel) {
// System.out.println("Ordbok.setTittel");
if (! isValidTitle(tittel))
throw new IllegalArgumentException(tittel +
" er ikke rett navn på en ordbok");
// this.tittel = tittel; // Men da tester en ikke for feil tegn... Da må en:
super.setTittel(tittel);
}
// isValidTitle overskygger Bok sin, men den sjekker på noe annet...
// Det nye kravet er at en ordbok må slutte på "ordbok". Vi må allikevel
// også huske på å sjekke at den følger super sine krav, så det kan sjekkes først:
public boolean isValidTitle(String tittel) {
// System.out.println("Ordbok.isValidTitle");
if (! super.isValidTitle(tittel)) {
return false;
}
return tittel.endsWith("ordbok");
}
// Denne kalles når en Bok kalles med toString().
protected String GetToStringAttributes() {
return super.GetToStringAttributes() + ", antallOrd=" + antallOrd;
}
public static void main(String[] args) {
Ordbok ordbok = new Ordbok("Nynorsk ordbok", 98543);
System.out.println(ordbok);
// Ordbok ordbok2 = new Ordbok("Nynorsk ordbøk", 98543);
// System.out.println(ordbok2);
System.out.println(ordbok instanceof Bok);
System.out.println(ordbok.getClass().equals(uke13.arv.bok_avansert.Bok.class));
System.out.println(ordbok.getClass().equals(uke13.arv.bok_avansert.Ordbok.class));
// Substitusjonsprinsippet, kan vi bruke dette fullstendig her?
// Vi kan ikke bruke Ordbok for å lage alle slags bøker, da vi har krav for tittel
// Vi setter altså større krav til en tittel her enn for en Bok. Da virker ikke substitusjonsprinsippet
// I tillegg krever vi antallOrd i konstruktøren...
// Se https://stackoverflow.com/questions/56860/what-is-an-example-of-the-liskov-substitution-principle
// Bok bok = new Ordbok(""); // Går jo ikke.
// En bedre løsning er å bruke abstrakte klasser, og/eller interface.
}
}
package uke13.arv.bok_avansert;
public class Tegneseriealbum extends Bok {
int antallStriper;
public Tegneseriealbum(String tittel, int antallStriper) {
super(tittel); // Merk at vi bruker Bok sin konstruktør, for å sjekke tittelkorrekthet
this.antallStriper = antallStriper;
}
public int getAntallStriper() {
return antallStriper;
}
// Denne kalles når en Bok kalles med toString().
protected String GetToStringAttributes() {
return super.GetToStringAttributes() + ", antallStriper=" + antallStriper;
}
public void setAntallStriper(int antallStriper) {
this.antallStriper = antallStriper;
}
}
package uke13.arv.bok_feil;
public class Bok {
String title;
public Bok(String title) {
System.out.println("Bok.Contructor");
setTitle(title);
}
boolean isValidTitle(String tittel) {
System.out.println("Bok.isValidtitle");
if (tittel.equals("Invalid")) return false;
return true;
}
public void setTitle(String tittel) {
System.out.println("Bok.setTitle");
if (isValidTitle(tittel))
this.title = tittel;
}
@Override
public String toString() {
return this.title;
}
public static void main(String[] args) {
// Bok bok = new Bok("Valid");
// System.out.println(bok);
Ordbok ordbok = new Ordbok("Tittel");
}
}
package uke13.arv.bok_feil;
/**
* Poenget med denne klassen er å belyse problemstillingen gitt i nest siste lysark
* Ordbok sin konstruktør kaller super sin konstruktør
* Super sin konstruktør kaller isValidTitle
* isValidTitle er overskygget i Ordbok, så denne vil brukes i stedet
* Ordbok.isValidTitle refererer til et felt i Ordbok, men dette er ikke satt ennå,
* fordi vi fremdeles er i fasen der super() lages. Rot!
*/
public class Ordbok extends Bok {
int antallOrd;
String tittelslutt = "ordbok"; // Dette kunne ha vært viktig!
public Ordbok(String title) {
super(title);
System.out.println("Ordbok.Constructor etter super.Constructor");
}
public void setAntallOrd(int antallOrd) {
this.antallOrd = antallOrd;
}
@Override
boolean isValidTitle(String title) {
System.out.println("Ordbok.isValidTitle");
if (super.isValidTitle(title))
if (title.endsWith(tittelslutt))
return true;
return false;
}
}
package uke13.unntak;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class CloseUnopenedFile {
private static void lesFil() {
String filnavn = "C:/Users/borgeha/tdt4100-v2022/students/foreksempel/src/main/java/uke13/unntak/Linjer.txt";
BufferedReader br = null;
try (FileReader fr = new FileReader(filnavn)) {
br = new BufferedReader(fr);
int count = 0;
String linje;
while (br.ready()) {
linje = br.readLine();
count++;
System.out.println("Linje nummer "+count+": "+linje);
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
lesFil();
}
}
package uke13.unntak;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
public class Feiltyper {
// Diverse feiltyper!
public static void main(String[] args) {
// Nullpointerexception:
// String foo = null;
// int length = foo.length();
// Classcastexception:
// Object i = Integer.valueOf(42);
// String s = (String)i;
// Indexoutofboundserror:
// List<String> ls=new ArrayList<>();
// ls.add("a");
// ls.add("b");
// ls.get(2);
// nosuchelementexception:
// List<String> ls = new ArrayList<>();
// Iterator<String> it = ls.iterator();
// System.out.println(it.next());
// UnsupportedOperationException
// String[] flowers = { "Ageratum", "Allium", "Poppy", "Catmint" };
// List<String> flowerList = Arrays.asList(flowers); // Hold musen over asList, den er fixed-size!
// // List<String> flowerList = new ArrayList<>(Arrays.asList(flowers)); // Løsningen
// // For en beskrivelse se feks https://www.javacodexamples.com/examples/why-does-arrays-aslist-return-a-fixed-size-list
// flowerList.add("Celosia");
// flowerList.forEach(System.out::println);
// IllegalArgumentException:
// Map<String, Integer> tempMap = Map.of(
// "Ost", 13,
// "Pølse", 19,
// "Ost", 13, // !
// "Bacalao", 14
// );
}
}
package uke13.unntak;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
public class FilFinally {
private static void lesFil() {
BufferedReader br = null; // For å initialisere den...
try {
int a = 3/0;
String filnavn = "C:/Users/borgeha/tdt4100-v2022/students/foreksempel/src/main/java/uke13/unntak/Linjer.txt";
FileReader fr = new FileReader(filnavn);
br = new BufferedReader(fr);
int count = 0;
String linje;
while (br.ready()) {
linje = br.readLine();
count++;
System.out.println("Linje nummer "+count+": "+linje);
}
} catch (IOException e) {
System.out.println("IOException: "+e.getMessage());;
}
finally {
System.out.println("Før close");
try {
if (br != null)
br.close();
} catch (IOException e) {