Grundläggande termer… • Hålla koll på olika version, kunna gå tillbaka, etc. • Repo/Repository - förvaring/administrering av förändringar • Centraliserad/Decentraliserad F11 Grunderna i Versionshantering • Lokal repo/”remote”-repo • Revisioner - namnge/tagga • Trunk/Master-spår • Branch -gren/spår • clone, commit, revert, rebase, merge, pull, cherry-pick, stash • Merge-konflikter som måste hanteras • Commits namnges • http://www.dwahlberg.se/2011/versionshantering-for-nyborjare/ 383 Johan Eliasson Git basic Några olika system • Det finns mängder av programvaror • GIT • Mercurial • CVS • SVN (Subversion). • Senare programvara. Åtgärdar några av problemen som finns i CVS • Dom flesta kör man i grunden i ”terminal-fönster” • Det finns även en mängd Program/web-tjänster som lägger på ett grafisk gränssnitt • BitBucket, SourceTree, etc • Det finns plug-ins/utökningar till många IDE:er för de vanligaste versionshanteringssystemen • Eclips+Git, Eclipse+SVN, … 384 • IntelliJ+Git, IntelliJ+ Mercurial,.. http://onlywei.github.io/explain-git-with-d3/# http://marklodato.github.io/visual-git-guide/index-en.html Johan Eliasson Git basic Git basic Origin Local #1 Local #3 Local #2 https://git-scm.com/book/en/v2/Git-Basics-Recording-Changes-to-the-Repository http://onlywei.github.io/explain-git-with-d3/# http://onlywei.github.io/explain-git-with-d3/# Johan Eliasson Johan Eliasson Git basic Arbetsflöden… • Några grundläggande arbetsflöden – Loggning av förändringar – Backa till en tidigare version och fortsätta på den – Jobba samtidigt med olika ”features” – Hantera olika versioner av ”samma” system Johan Eliasson • Jobba med de grundläggande arbetsflöden tillsammans med andra – Logga och delge förändringar – Kräver att man kan synkronisera vad olika 389 användare förändrar, mm Don’t panic! GitFlow Johan Eliasson Johan Eliasson Generics F11 Generics Ännu ett sätt att lösa ett gammalt problem: skriva så lite kod som möjligt Hur implementerar vi då egna generiska klasser/metoder? Johan Eliasson Johan Eliasson Genrisk klass med Typ-parameter • Vill egentligen ha: import java.util.Iterator; public class GenericList<T> implements Iterable<T>{ • Lista av heltal private class Element implements Position{ private T value; private Element next; • Lista av strängar • Lista av ... public Element() { value=null; Återanvända algoritmer för olika datatyper next=null; } public Element(T value, Element next) { this.value=value; this.next=next; } } private class ListIterator implements Iterator<T> { Element next; public ListIterator(Element first) { next=first; } @Override public boolean hasNext() { return next.next()!=null; Jan Erik Moström Jan Erik Moström Genrisk metod med Typ-parameter o1.insert(new Object(), o1.first()); String s=s1.inspect(s1.first()); static <T> void fromArrayToCollection(T[] a, Collection<T> c) { for (T o : a) { c.add(o); // Correct } } public static void main(String[] args) { GenericList<String> s1=new GenericList<String>(); GenericList<Object> o1=s1; } Type mismatch: cannot convert from GenericList<Sting> to GenericList<Object> Jan Erik Moström Johan Eliasson Men kod som fungerar på alla generiska klasser? Innan generics • Till exempel skriva ut alla saker i listan import java.util.LinkedList; import java.util.List; public class Demo4b { public static void main( String argv[] ) { LinkedList l = new LinkedList(); l.add( "Hello" ); l.add( "World" ); printStuff( l ); } public static void printStuff( List sl ) { Object o = null; while( !sl.isEmpty() ){ o = sl.remove(0); System.out.println( o ); } } } Johan Eliasson Johan Eliasson import java.util.LinkedList; import java.util.List; public class Demo4b { public static void main( String argv[] ) { LinkedList<String> l = new LinkedList<String>(); l.add( "Hello" ); l.add( "World" ); printStuff( l ); } public class Demo4b { public static void main( String argv[] ) { LinkedList<String> l = new LinkedList<String>(); l.add( "Hello" ); l.add( "World" ); printStuff( l ); } public static void printStuff( List<?> sl ) { Object o = null; while( !sl.isEmpty() ){ o = sl.remove(0); System.out.println( o ); } } public static void printStuff( List<Object> sl ) { Object o = null; Demo4b.java:9: while( !sl.isEmpty() printStuff(java.util.List<java.lang.Object>) ){ in o = sl.remove(0); Demo4b cannot be applied to System.out.println( (java.util.LinkedList<java.lang.String>) o ); } printStuff( l ); } ^ 1 error } } Johan Eliasson public static void doStuff( GenericList<?> sl ) { Object o = sl.head(); sl.append( o ); } Johan Eliasson import lists.GenericList; import shapes.*; public class Demo5 { public static void main( String argv[] ) { GenericList<Circle> cl = new GenericList<Circle>(); GenericList<Rectangle> rl = new GenericList<Rectangle>(); // Do something useful doUsefulShapeStuff( cl ); doUsefulShapeStuff( rl ); public static void doStuff( GenericList<?> sl ) { String o = sl.head(); sl.append( o ); } } public static void doUsefulShapeStuff( GenericList<?> sl ) { // xxxxxxxx } } Johan Eliasson import lists.GenericList; import shapes.*; Johan Eliasson import lists.GenericList; import shapes.*; public class Demo5 { public static void main( String argv[] ) { GenericList<Circle> cl = new GenericList<Circle>(); GenericList<Rectangle> rl = new GenericList<Rectangle>(); public class Demo5 { public static void main( String argv[] ) { GenericList<Circle> cl = new GenericList<Circle>(); GenericList<Rectangle> rl = new GenericList<Rectangle>(); // Do something useful // Do something useful doUsefulShapeStuff( cl ); doUsefulShapeStuff( rl ); doUsefulShapeStuff( cl ); doUsefulShapeStuff( rl ); GenericList<String> sl = new GenericList<String>(); doUsefulShapeStuff( sl ); GenericList<String> sl = new GenericList<String>(); doUsefulShapeStuff( sl ); } } public static void doUsefulShapeStuff( GenericList< ? extends Shape > sl ) { // xxxxxxxx } public static void doUsefulShapeStuff( GenericList<?> sl ) { // xxxxxxxx } } } Johan Eliasson Johan Eliasson Generic arrays • Det går även att begränsa en Generisk typ åt andra hållet • Java tillåter inte skapandet av arrayer av generisk typ • Görs mha super • Eg.: •TreeSet(Comparator<? super E> c) • ? svarar i detta fall mot en godtycklig superklass till E public class Stack<E>{ private E[] data =new E[10]; ... } är ej tillåtet • Lösningen: Skapa en array av objekts och typkonvertera denna public class Stack<E>{ private E[] data = (E[]) (new Object[10]); ... } • Fast det genererar en varning från kompilatorn :-( Johan Eliasson Johan Eliasson Värt att veta Generics i Java 7 • Alla instanser av en generisk klass delar samma kod • En ny ”Diamant” operator • En del andra språk kompilerar upp en ny version av koden för varje instans av den generiska klassen (och ibland värre än så!!) List<String> list = new LinkedList<>(); • I detta fall så kommer java att för konstruktorn göra ett antagande att det är LinkedList<String>(); som ska köras. • Diamantoperatorn kan användas så länge som Java kan lista ut vilken typ som menas i sammanhanget. Följande funkar tex inte: List<String> list = new ArrayList<>(); list.add("A"); list.addAll(new ArrayList<>()); • Eftersom addAll i detta fall förväntar sig en collection som innehåller en String eller en subklass till den (och inte kan avgöra typen). Johan Eliasson Johan Eliasson Klona ett objekt • Göra en kopia av ett objekt F11 Klona objekt • Definerat i Object • protected Object clone() throws CloneNotSupportedException • Kan behövas implementeras i din klass Johan Eliasson Johan Eliasson Skapa en grund kopia Djup kopiering • Attribut av primitiv typ fixas automatiskt (av versionen av metoden i Object) • Attributobjekt klonas inte (bara referensen dupliceras) • I fallet nedan kommer klonade OtherClass-objekt dela på SomeClass objektet som var attribut • Klona även attributobjekt • Attributobjekten måste även gå att klona public class OtherClass implements java.lang.Cloneable { private SomeClass sc; public Object clone( ) throws java.lang.CloneNotSupportedException { OtherClass x = (OtherClass) super.clone(); x.sc = (SomeClass) sc.clone(); return x; } public class OtherClass implements java.lang.Cloneable { private SomeClass sc; public Object clone( ) throws java.lang.CloneNotSupportedException { return super.clone(); } } } Johan Eliasson Johan Eliasson Djup kopiering Göra objekt klonbara • Klona även attributobjekt • Implementera java.lang.Cloneable • Undantaget java.lang.CloneNotSupportedException kastas om man anropar Object.clone() för ett objekt som inte implementerar Clonable-interfacet • clone i Object är definierad protected men man brukar omdefiniera den med en public clone metod • Klona attribut som är objekt • Klona inte objekt som är “immutable” • Anropa super.clone för att klona föräldraobjekts parametrar (och för att objects variant ska ta hand om primitiva typer och referenser) • Attributobjekten måste även gå att klona public class SomeClass implements java.lang.Cloneable { private ArrayList<Circles> circleList; public Object clone( ) throws java.lang.CloneNotSupportedException { SomeClass x = (SomeClass) super.clone(); x.circleList = (ArrayList) circleList.clone();???????? return x; } } Johan Eliasson Johan Eliasson