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