Grundläggande termer F11 Grunderna i Versionshantering Hålla koll på olika version, kunna gå tillbaka, etc. Repo/Repository - förvaring/administrering av förändringar Centraliserad/Decentraliserad 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 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, IntelliJ+Git, IntelliJ+ Mercurial,.. 384 http://onlywei.github.io/explain-git-with-d3/# http://marklodato.github.io/visual-git-guide/index-en.html 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/#
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 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 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?
Jan Erik Moström Vill egentligen ha: Lista av heltal Lista av strängar Lista av... Återanvända algoritmer för olika datatyper Genrisk klass med Typ-parameter import java.util.iterator; public class GenericList<T> implements Iterable<T> private class Element implements Position private T value; private Element next; public Element() value=null; 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 Genrisk metod med Typ-parameter static <T> void fromarraytocollection(t[] a, Collection<T> c) for (T o : a) c.add(o); // Correct o1.insert(new Object(), o1.first()); String s=s1.inspect(s1.first()); 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 Men kod som fungerar på alla generiska klasser? Till exempel skriva ut alla saker i listan Innan generics 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" ); public static void printstuff( List sl ) Object o = null; while(!sl.isempty() ) o = sl.remove(0); System.out.println( o );
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" ); 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 ); ^ 1 error public class Demo4b public static void main( String argv[] ) LinkedList<String> l = new LinkedList<String>(); l.add( "Hello" ); l.add( "World" ); public static void printstuff( List<?> sl ) Object o = null; while(!sl.isempty() ) o = sl.remove(0); System.out.println( o ); public static void dostuff( GenericList<?> sl ) Object o = sl.head(); sl.append( o ); 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 static void dostuff( GenericList<?> sl ) String o = sl.head(); sl.append( o ); // Do something useful dousefulshapestuff( cl ); dousefulshapestuff( rl ); public static void dousefulshapestuff( GenericList<?> sl ) // xxxxxxxx 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>(); 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 // Do something useful dousefulshapestuff( cl ); dousefulshapestuff( rl ); GenericList<String> sl = new GenericList<String>(); dousefulshapestuff( sl ); public static void dousefulshapestuff( GenericList<?> sl ) // xxxxxxxx dousefulshapestuff( cl ); dousefulshapestuff( rl ); GenericList<String> sl = new GenericList<String>(); dousefulshapestuff( sl ); public static void dousefulshapestuff( GenericList<? extends Shape > sl ) // xxxxxxxx
Generic arrays Det går även att begränsa en Generisk typ åt andra hållet Görs mha super TreeSet(Comparator<? super E> c)? svarar i detta fall mot en godtycklig superklass till E Java tillåter inte skapandet av arrayer av generisk typ Eg.: 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 :-( Värt att veta Alla instanser av en generisk klass delar samma kod 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å!!) Generics i Java 7 En ny Diamant operator 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). Klona ett objekt F11 Klona objekt Göra en kopia av ett objekt Definerat i Object protected Object clone() throws CloneNotSupportedException Kan behövas implementeras i din klass
Skapa en grund kopia 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 Djup kopiering Klona även attributobjekt Attributobjekten måste även gå att klona public class OtherClass implements java.lang.cloneable private SomeClass sc; public class OtherClass implements java.lang.cloneable private SomeClass sc; public Object clone( ) throws java.lang.clonenotsupportedexception return super.clone(); public Object clone( ) throws java.lang.clonenotsupportedexception OtherClass x = (OtherClass) super.clone(); x.sc = (SomeClass) sc.clone(); return x; Djup kopiering Klona även attributobjekt 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; Göra objekt klonbara 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)