Slide 1

Slide 1 text

Kotlin Ͱվળ͢Δ AndroidΞϓϦͷ඼࣭ ͋Μ͍͟Ώ͖ʢ@yanzmʣ Kotlin Fest 2018

Slide 2

Slide 2 text

ͳͥ඼࣭ͷ࿩Λ͢Δͷ͔ • ಈ͍͍ͯΔΞϓϦΛ Java ͔Β Kotlin ʹҠߦ͢Δͷ͸೉ ͍͠ • ॻ͖௚͠ͷίετ • σάϨͷϦεΫ • ίετ΍ϦεΫΛ্ճΔޮՌ͕͋Δͷ͔ʁ

Slide 3

Slide 3 text

Android ΞϓϦͷ඼࣭ʁ • ଎͍ • མͪͳ͍ • ࢖͍΍͍͢ • …

Slide 4

Slide 4 text

Android ΞϓϦͷ඼࣭ʁ • มߋ͠΍͍͢ • ಡΈ΍͍͢ • …

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

ιϑτ΢ΣΞͷ඼࣭ = ཁҼͷ૊Έ߹Θͤ • ֎త඼࣭ཁҼ • ιϑτ΢ΣΞ੡඼ʹͦͷੑ࣭͕͋Δ͔ͳ͍͔ΛϢʔβʔ͕ೝ ࣝͰ͖Δੑ࣭ • εϐʔυɺ࢖͍΍͢͞ɺ… • ಺త඼࣭ཁҼ • ιϑτ΢ΣΞ੡඼ʹ͍ͭͯܗ༰͞ΕΔͦΕҎ֎ͷੑ࣭ • ϞδϡʔϧੑɺಡΈ΍͢͞ɺ…

Slide 7

Slide 7 text

֎త඼࣭ཁҼͷಛʹॏཁͳ4ཁҼ • ਖ਼֬͞ʢcorrectnessʣ • ؤৎ͞ʢrobustnessʣ • ৴པੑ = ਖ਼֬͞ + ؤৎ͞ • ֦ுੑʢextendibilityʣ • ࠶ར༻ੑʢreusabilityʣ • Ϟδϡʔϧੑ = ֦ுੑ + ࠶ར༻ੑ

Slide 8

Slide 8 text

Java ͱ඼࣭ • ௕೥ୈҰઢͰ࢖ΘΕ͍ͯΔ • ඼࣭ཁҼʹؔ࿈͢Δ༷ʑͳϓϥΫςΟεɺΠσΦϜɺن ଇɺݪଇɺσβΠϯύλʔϯͳͲ

Slide 9

Slide 9 text

JavaͰ޿࣮͘ફ͞Ε͍ͯΔ نଇ͸KotlinͩͱͲ͏ͳΔʁ

Slide 10

Slide 10 text

No content

Slide 11

Slide 11 text

߲໨2 ਺ଟ͘ͷίϯετϥΫλύϥϝʔλʹ௚໘ͨ࣌͠ ʹ͸ϏϧμʔΛݕ౼͢Δ new NutritionFacts(240, 8, 100, 0, 35, 27); new NutritionFacts.Builder(240, 8) .calories(100) .sodium(35) .carbohydrate(27) .build(); NG OK

Slide 12

Slide 12 text

߲໨2 ਺ଟ͘ͷίϯετϥΫλύϥϝʔλʹ௚໘ͨ࣌͠ ʹ͸ϏϧμʔΛݕ౼͢Δ Kotlin class NutritionFacts( val servingSize: Int, val servings: Int, val calories: Int = 0, val fat: Int = 0, val sodium: Int = 0, val carbohydrate: Int = 0 ) NutritionFacts( 240, 8, calories = 100, sodium = 35, carbohydrate = 27 )

Slide 13

Slide 13 text

AlertDialog( message = "࡟আ͠·͔͢ʁ", negativeButtonLabel = "͸͍", positiveButtonListener = { delete() } ) class AlertDialog( private val title: String? = null, private val message: String? = null, private val positiveButtonLabel: String? = null, private val positiveButtonListener: (() -> Unit)? = null, private val negativeButtonLabel: String? = null, private val negativeButtonListener: (() -> Unit)? = null ) NG Kotlin

Slide 14

Slide 14 text

AlertDialog.Builder() .message("࡟আ͠·͔͢ʁ") .positiveButton("͸͍") { delete() } .build() class AlertDialog private constructor(…) { class Builder { … private var positiveButtonLabel: String? = null private var positiveButtonListener: (() -> Unit)? = null … fun positiveButton(label: String, listener: (() -> Unit)?): Builder { positiveButtonLabel = label positiveButtonListener = listener return this } … } } OK ෆมࣜΛߏ੒͢ΔύϥϝʔλશମΛηολʔͰड͚औΔ Kotlin

Slide 15

Slide 15 text

߲໨3 private ͷίϯετϥΫλ͔ enum ܕͰγϯάϧ τϯಛੑΛڧ੍͢Δ ΦϒδΣΫτએݴΛ͔ͭ͏ object Elvis { fun leaveTheBuilding() { … } } Kotlin

Slide 16

Slide 16 text

߲໨4 private ͷίϯετϥΫλͰΠϯελϯεԽෆՄ ೳΛڧ੍͢Δ ΦϒδΣΫτએݴ or τοϓϨϕϧؔ਺ fun util1(a: Int, b: Int): Int { … } public class UtilityClass { private UtilityClass() { } public static int util1(int a, int b) { … } } Kotlin

Slide 17

Slide 17 text

߲໨5 ෆඞཁͳΦϒδΣΫτͷੜ੒Λආ͚Δ Java Ͱ͸ॻ͚ͯ͠·͏ new String("hello"); new Boolean(true); Kotlin Ͱ͸ίϯύΠϧΤϥʔ String("hello") Boolean(true)

Slide 18

Slide 18 text

߲໨8 equals ΛΦʔόʔϥΠυ͢Δͱ͖͸Ұൠܖ໿ʹ ͕ͨ͠͏ public class MyClass { public boolean equals(MyClass o) { … } } class MyClass { override fun equals(o: MyClass): Boolean { … } } Java Ͱ͸ॻ͚ͯ͠·͏ Kotlin Ͱ͸ίϯύΠϧΤϥʔ

Slide 19

Slide 19 text

߲໨9 equals ΛΦʔόʔϥΠυ͢Δ࣌͸ɺৗʹ hashCode ΛΦʔόʔϥΠυ͢Δ IDE ʹΑΔੜ੒Λར༻͢Δ or data class Λར༻͢Δ equals(), hashCode() ͷ࣮૷͸खͰॻ͘ͷ͸೉͍͠ Kotlin

Slide 20

Slide 20 text

߲໨11 clone Λ஫ҙͯ͠ΦʔόʔϥΠυ͢Δ public class Object { … protected native Object clone() throws CloneNotSupportedException; } ʮΦϒδΣΫτͷίϐʔΛߦ͏ԿΒ͔ͷ୅ସखஈΛఏڙ͢Δ͔ɺ ΦϒδΣΫτͷෳ੡Λ୯ʹఏڙ͠ͳ͍ํ͕͓ͦΒ͘ݡ໌Ͱ͢ɻʯ Kotlin ͷ Any ʹ͸ clone() ͕ͳ͍ Kotlin

Slide 21

Slide 21 text

߲໨11 clone Λ஫ҙͯ͠ΦʔόʔϥΠυ͢Δ ʮΦϒδΣΫτͷίϐʔʹର͢Δ্ख͍ํ๏͸ɺίϐʔίϯετ ϥΫλ͔ίϐʔϑΝΫτϦΛఏڙ͢Δ͜ͱͰ͢ɻʯ data class ͷ copy() val donutsBook = Book("donuts", "Android") val eclairBook = donutsBook.copy(title = "eclair") Iterable ͷ֦ுؔ਺ toList() val list = listOf("donuts", "eclair") val list2 = list.toList() Kotlin

Slide 22

Slide 22 text

data class Person( val name: String, val age: Int ) : Comparable { override fun compareTo(other: Person): Int { age.compareTo(other.age).let { if (it != 0) { return it } } return name.compareTo(other.name) } } ߲໨12 Comparable ͷ࣮૷Λݕ౼͢Δ Kotlin ͷ਺஋ܕ,Boolean,String,Char͸ compareTo() ͕༻ ҙ͞Ε͍ͯΔ ೥ྸঢॱ → ໊લABCॱ Kotlin

Slide 23

Slide 23 text

߲໨12 Comparable ͷ࣮૷Λݕ౼͢Δ ඪ४ؔ਺Λ׆༻͢Δ data class Person( val name: String, val age: Int ) : Comparable { override fun compareTo(other: Person): Int { return compareValuesBy(this, other, { it.age }, { it.name }) } } ೥ྸঢॱ → ໊લABCॱ Kotlin

Slide 24

Slide 24 text

߲໨13 Ϋϥεͱϝϯόʔ΁ͷΞΫηεՄೳੑΛ࠷খݶ ʹ͢Δ ʮ֤Ϋϥε΍ϝϯόʔΛͰ͖ΔݶΓΞΫηεͰ͖ͳ͍Α͏ʹ ͢΂͖Ͱ͢ɻʯ Java Kotlin private, package private (default), protected, public private, internal, protected, public (default)

Slide 25

Slide 25 text

߲໨14 public ͷΫϥεͰ͸ɺpublic ͷϑΟʔϧυͰ͸ ͳ͘ɺΞΫηαʔϝιουΛ࢖͏ ʮ·ͱΊΔͱɺpublicͷΫϥε͸ܾͯ͠ՄมͷϑΟʔϧυΛެ։ ͢΂͖Ͱ͸͋Γ·ͤΜɻʯ public class Person { String name; int age; public Person(String name, int age) { this.name = name; this.age = age; } } NG

Slide 26

Slide 26 text

߲໨14 public ͷΫϥεͰ͸ɺpublic ͷϑΟʔϧυͰ͸ ͳ͘ɺΞΫηαʔϝιουΛ࢖͏ public class Person { private String name; private int age; … public String getName() { return name; } public void setName(String name) { this.name = name; } … } OK

Slide 27

Slide 27 text

߲໨14 public ͷΫϥεͰ͸ɺpublic ͷϑΟʔϧυͰ͸ ͳ͘ɺΞΫηαʔϝιουΛ࢖͏ ֎෦͔ΒͷϓϩύςΟΞΫηε͸ৗʹ getter setter ܦ༝ ͳͷͰɺݴޠͱͯ͠ΞΫηαʔϝιου͕ڧ੍͞Ε͍ͯΔ Kotlin class Person(name: String, age: Int) { var name: String = name set(value) { println("set : name = $value") field = value } … }

Slide 28

Slide 28 text

߲໨15 ՄมੑΛ࠷খݶʹ͢Δ • 1. ΦϒδΣΫτͷঢ়ଶΛมߋ͢ΔͨΊʹ͍͔ͳΔϝιου΋ ఏڙ͠ͳ͍ • 2. Ϋϥε͕֦ுͰ͖ͳ͍͜ͱΛอূ͢Δɻ • 3. ͢΂ͯͷϑΟʔϧυΛ fi nal ʹ͢Δ • 4. ͢΂ͯͷϑΟʔϧυΛ private ʹ͢Δ • 5. Մมίϯϙʔωϯτʹର͢Δಠ઎తΞΫηεΛอূ͢Δɻ

Slide 29

Slide 29 text

߲໨15 ՄมੑΛ࠷খݶʹ͢Δ • 1. ΦϒδΣΫτͷঢ়ଶΛมߋ͢ΔͨΊʹ͍͔ͳΔϝιου΋ ఏڙ͠ͳ͍ • 2. Ϋϥε͕֦ுͰ͖ͳ͍͜ͱΛอূ͢Δɻ • 3. ͢΂ͯͷϓϩύςΟΛ val ʹ͢Δ • 4. ՄมίϯϙʔωϯτͷϓϩύςΟΛ private ʹ͢Δ • 5. Մมίϯϙʔωϯτʹର͢Δಠ઎తΞΫηεΛอূ͢Δɻ Kotlin

Slide 30

Slide 30 text

߲໨16 ܧঝΑΓίϯϙδγϣϯΛબͿ ʮܧঝ͸ڧྗͰ͕͢ɺΧϓηϧԽΛഁͬͯ͠·͏ͷͰ໰୊͕͋ Γ·͢ɻʯ public class InstrumentedSet extends HashSet { private int addCount = 0; @Override public boolean add(E e) { addCount++; return super.add(e); } @Override public boolean addAll(@NotNull Collection c) { addCount += c.size(); return super.addAll(c); } } NG

Slide 31

Slide 31 text

public class InstrumentedSet implements Set { private final Set s; private int addCount = 0; public InstrumentedSet(Set s) { this.s = s; } @Override public boolean add(E e) { addCount++; return s.add(e); } @Override public boolean addAll(@NotNull Collection c) { addCount += c.size(); return s.addAll(c); } @Override public int size() { return s.size(); } … } OK

Slide 32

Slide 32 text

public class InstrumentedSet implements Set { private final Set s; private int addCount = 0; public InstrumentedSet(Set s) { this.s = s; } @Override public boolean add(E e) { addCount++; return s.add(e); } @Override public boolean addAll(@NotNull Collection c) { addCount += c.size(); return s.addAll(c); } @Override public int size() { return s.size(); } @Override public boolean isEmpty() { return s.isEmpty(); } @Override public boolean contains(Object o) { return s.contains(o); } @NotNull @Override public Iterator iterator() { return s.iterator(); } @NotNull @Override public Object[] toArray() { return s.toArray(); } @NotNull @Override public T[] toArray(@NotNull T[] a) { return s.toArray(a); } @Override public boolean remove(Object o) { return s.remove(o); } @Override public boolean containsAll(@NotNull Collection c) { return s.contains(c); } @Override public boolean retainAll(@NotNull Collection c) { return s.retainAll(c); } @Override public boolean removeAll(@NotNull Collection c) { return s.removeAll(c); } @Override public void clear() { s.clear(); } } సૹͯ͠Δ͚ͩ

Slide 33

Slide 33 text

class InstrumentedSet2( private val s: MutableSet ) : MutableSet by s { private var addCount = 0 override fun add(element: E): Boolean { addCount++ return s.add(element) } override fun addAll(elements: Collection): Boolean { addCount += elements.size return s.addAll(elements) } } Kotlin

Slide 34

Slide 34 text

߲໨17 ܧঝͷͨΊʹઃܭ͓ΑͼจॻԽ͢ΔɺͰͳ͚Ε ͹ܧঝΛېࢭ͢Δ public final class Point { public class Point { private Point(int x, int y) { … } public static Point of(int x, int y) { return new Point(x, y); } ΫϥεΛ fi nal ͱએݴ͢Δ ίϯετϥΫλΛ private ͔ύοέʔδϓϥΠϕʔτʹͯ͠ɺ୅ ΘΓʹ static ϑΝΫτϦʔϝιουΛ௥Ճ͢Δ

Slide 35

Slide 35 text

߲໨17 ܧঝͷͨΊʹઃܭ͓ΑͼจॻԽ͢ΔɺͰͳ͚Ε ͹ܧঝΛېࢭ͢Δ ܧঝͷͨΊʹઃܭ͓ΑͼจॻԽ͞ΕͨΫϥε͚ͩ open ʹ͢Δ Kotlin

Slide 36

Slide 36 text

߲໨18 ந৅ΫϥεΑΓΠϯλϑΣʔεΛબͿ • طଘͷΫϥεΛɺ৽ͨͳΠϯλϑΣʔεΛ࣮૷͢ΔΑ͏ʹ มߋ͢Δ͜ͱ͸༰қʹͰ͖Δ • ΠϯλϑΣʔε͸ɺϛοΫεΠϯΛఆٛ͢Δʹ͸ཧ૝త • ΠϯλϑΣʔε͸ɺ֊૚Λ࣋ͨͳ͍ܕϑϨʔϜϫʔΫΛߏ ங͢Δ͜ͱ͕Ͱ͖Δ • ந৅ࠎ࣮֨૷Λఏڙ͢Δ͜ͱͰΠϯλϑΣʔεΛந৅Ϋϥ εͷ௕ॴΛ૊Έ߹ΘͤΔ͜ͱ͕Ͱ͖Δ

Slide 37

Slide 37 text

߲໨18 ந৅ΫϥεΑΓΠϯλϑΣʔεΛબͿ Kotlin • ΠϯλϑΣʔεʹϓϩύςΟΛએݴͰ͖Δ • ΠϯλϑΣʔεʹσϑΥϧτ࣮૷Λ༩͑Δ͜ͱ͕Ͱ͖Δ

Slide 38

Slide 38 text

߲໨19 ܕΛఆٛ͢ΔͨΊ͚ͩʹΠϯλϑΣʔεΛ࢖༻ ͢Δ ఆ਺ͷम০Λճආ͢ΔͨΊʹఆ਺ΛΠϯλϑΣʔεʹఆٛ͠ ͍ͯΔ public interface PhysicalConstants { double AVOGADROS_NUMBER = 6.02214199e23; } public class Atoms implements PhysicalConstants { public double atoms() { return AVOGADROS_NUMBER * mols; } … } NG

Slide 39

Slide 39 text

߲໨19 ܕΛఆٛ͢ΔͨΊ͚ͩʹΠϯλϑΣʔεΛ࢖༻ ͢Δ ఆ਺ϢʔςΟϦςΟΫϥε + static Πϯϙʔτ public class PhysicalConstants { private PhysicalConstants() {} // ΠϯελϯεԽΛ๷ࢭ public static final double AVOGADROS_NUMBER = 6.02214199e23; } import static net.yanzm.sample.PhysicalConstants.AVOGADROS_NUMBER; public class Atoms { public double atoms() { return AVOGADROS_NUMBER * mols; } … } OK

Slide 40

Slide 40 text

߲໨19 ܕΛఆٛ͢ΔͨΊ͚ͩʹΠϯλϑΣʔεΛ࢖༻ ͢Δ Interface ʹఆ਺ΛఆٛͰ͖ͳ͍ interface PhysicalConstants { const val AVOGADROS_NUMBER = 6.02214199e23 } object PhysicalConstants { const val AVOGADROS_NUMBER = 6.02214199e23 } ίϯύΠϧΤϥʔ OK τοϓϨϕϧʹఆ਺ΛఆٛͰ͖Δ const val AVOGADROS_NUMBER = 6.02214199e23 ఆ਺ϢʔςΟϦςΟͱͯ͠ object Λ࢖͑͹ෆཁͳΠϯελϯεԽ Λ๷͛Δ OK Kotlin

Slide 41

Slide 41 text

߲໨20 λά෇ΫϥεΑΓΫϥε֊૚ΛબͿ λά෇͖Ϋϥε͸ɺ৑௕ͰɺޡΓ΍͘͢ɺඇޮ཰

Slide 42

Slide 42 text

public class Figure { enum Shape {RECTANGLE, CIRCLE} final Shape shape; double length, width; // RECTANGLE ͷ৔߹͚ͩ࢖ΘΕΔ double radius; // CIRLE ͷ৔߹͚ͩ࢖ΘΕΔ Figure(double length, double width) { shape = Shape.RECTANGLE; this.length = length; this.width = width; } Figure(double radius) { shape = Shape.CIRCLE; this.radius = radius; } double area() { switch (shape) { case RECTANGLE: return length * width; case CIRCLE: return Math.PI * radius * radius; default: throw new AssertionError(); } } } NG

Slide 43

Slide 43 text

abstract class Figure { abstract double area(); } public class Rectangle extends Figure { final double length, width; … @Override double area() { return length * width; } } public class Circle extends Figure { final double radius; … @Override double area() { return Math.PI * radius * radius; } } OK

Slide 44

Slide 44 text

sealed class Λ࢖ͬͨΫϥε֊૚Ͱஔ͖׵͑Δ sealed class Figure { abstract fun area(): Double } class Rectangle(val length: Double, val width: Double) : Figure() { override fun area(): Double { return length * width } } class Circle(val radius: Double) : Figure() { override fun area(): Double { return Math.PI * radius * radius } } Kotlin

Slide 45

Slide 45 text

߲໨21 ઓུΛදݱ͢ΔͨΊʹؔ਺ΦϒδΣΫτΛ࢖༻ ͢Δ public class Person { private final String name; private final int age; public Person(String name, int age) { this.name = name; this.age = age; } public static final Comparator NAME_LENGTH_ORDER = new Comparator() { @Override public int compare(Person o1, Person o2) { return o1.name.length() - o2.name.length(); } }; } OK

Slide 46

Slide 46 text

data class Person(val name: String, val age: Int) { companion object { val NAME_LENGTH_ORDER: Comparator = Comparator { o1, o2 -> o1.name.length - o2.name.length } } } list.sortedWith(Person.NAME_LENGTH_ORDER) data class Person(val name: String, val age: Int) { companion object { val NAME_LENGTH_ORDER: Comparator = compareBy { it.name.length } } } ඪ४ؔ਺Λ࢖༻ Kotlin

Slide 47

Slide 47 text

߲໨22 ඇ static ͷϝϯόʔΫϥεΑΓ static ͷϝϯ όʔΫϥεΛબͿ ʮΤϯΫϩʔδϯάΠϯελϯε΁ΞΫηε͢Δඞཁ͕ͳ͍ϝϯ όʔΫϥεΛએݴ͢ΔͷͰ͋Ε͹ɺͦͷએݴʹ static म০ࢠΛৗ ʹ෇͚Δʯ Java ϝϯόʔΫϥεͷએݴ͸σϑΥϧτ͕ඇ static → ໌ࣔతʹ static Λ෇͚ͳ͍ͱ͍͚ͳ͍ ϝϯόʔΫϥεͷએݴ͸σϑΥϧτ͕ not inner Kotlin

Slide 48

Slide 48 text

߲໨23 ݪܕΛ࢖༻͠ͳ͍ List ΍ Map Ͱ͸ͳ͘ɺList, Map ͷΑ ͏ʹৗʹܕύϥϝʔλΛࢦఆ͢Δ Ҡߦޓ׵ੑͷͨΊʹݪܕʢList ΍ Mapʣ͕࢒͞Ε͍ͯΔ ݪܕ͸࢖༻Ͱ͖ͣɺίϯύΠϧΤϥʔʹͳΔ Java Kotlin List list = new ArrayList(); NG val list :List = ArrayList() ίϯύΠϧΤϥʔ

Slide 49

Slide 49 text

߲໨25 ഑ྻΑΓϦετΛબͿ ഑ྻ͸ڞม ίϯύΠϧΤϥʔʹͳΒͳ͍ Array ͸ෆม ίϯύΠϧΤϥʔʹͳΔ Object[] objectArray = new Long[1]; val objectArray : Array = Array(1) { _ -> 0L } Java Kotlin

Slide 50

Slide 50 text

߲໨36 ৗʹ Override ΞϊςʔγϣϯΛ࢖༻͢Δ ΦʔόʔϥΠυ͢Δͱ͖͸ override Ωʔϫʔυ͕ඞਢͳͨΊ ҙਤ͠ͳ͍ΦʔόʔϥΠυ͕๷ࢭ͞Ε͍ͯΔ Kotlin @Override public boolean equals(Object obj) { … } OK fun equals(other: Any?): Boolean { … } ίϯύΠϧΤϥʔ

Slide 51

Slide 51 text

߲໨39 ඞཁͳ৔߹ʹ͸ɺ๷ޚతʹίϐʔ͢Δ List ͱ MutableList ͳͲɺίϨΫγϣϯΠϯλϑΣʔεͱ͠ ͯಡΈऔΓઐ༻ͱϛϡʔλϒϧ͕༻ҙ͞Ε͍ͯΔɻ ʢಡΈऔΓઐ༻ͷΠϯλϑΣʔεͰ΋๷ޚతίϐʔ͞Ε͍ͯ ΔΘ͚Ͱ͸ͳ͍ͷͰ஫ҙ͕ඞཁʣ Kotlin

Slide 52

Slide 52 text

߲໨46 ैདྷͷ for ϧʔϓΑΓ for-each ϧʔϓΛબͿ for (int i = 0; i < a.length; i++) { doSomething(a[i]); } NG OK for (Element e : elements) { doSomething(e); } for-each ͷΈ Kotlin for (e in elements) { doSomething(e) }

Slide 53

Slide 53 text

Java Ͱ for-each ϧʔϓ͕࢖༻Ͱ͖ͳ͍Α͋͘Δঢ়گ 1. ϑΟϧλϦϯά 2. ม׵ 3. ฒྻΠςϨʔγϣϯ Kotlin val even = list.filter { it % 2 == 0 } val square = list.map { it * it } for (i in 0 until min(list1.size, list2.size)) { val a = list1[i] val b = list2[i] }

Slide 54

Slide 54 text

߲໨49 ϘΫγϯά͞ΕͨجຊσʔλΑΓجຊσʔλܕ ΛબͿ ʮબ୒Ͱ͖Δ৔߹ʹ͸ɺϘΫγϯά͞ΕͨجຊσʔλʢInteger, Double, Boolean ͳͲʣͰ͸ͳ͘ɺجຊσʔλܕʢint, double, booleanʣΛ࢖༻͍ͯͩ͘͠͞ɻʯ ϓϦϛςΟϒܕͱϥούʔΫϥεΛ۠ผ͠ͳ͍ͨΊɺબ୒Λ ޡΔ͜ͱ͕ͳ͍ Kotlin

Slide 55

Slide 55 text

߲໨51 จࣈྻ݁߹ͷύϑΥʔϚϯεʹ༻৺͢Δ ʮύϑΥʔϚϯε͕ॏཁͰͳ͍৔߹Ҏ֎͸ɺ਺ݸҎ্ͷจࣈྻΛ ݁߹͢Δͷʹจࣈྻ݁߹ԋࢉࢠΛ࢖༻͠ͳ͍Ͱ͍ͩ͘͞ɻ୅ΘΓ ʹɺStringBuilder ͷ append ϝιουΛ࢖༻͍ͯͩ͘͠͞ɻʯ จࣈྻͷ݁߹ॲཧ͸ StringBuilder + append ʹίϯύΠϧ ͞ΕΔ Kotlin

Slide 56

Slide 56 text

fun main() { val a = "A" val b = "B" val c = a + b val d = "$a, $b" } public static final void main() { String a = "A"; String b = "B"; (new StringBuilder()).append(a).append(b).toString(); (new StringBuilder()).append(a).append(", ").append(b).toString(); } Decompile

Slide 57

Slide 57 text

߲໨59 νΣοΫ͞ΕΔྫ֎Λෆඞཁʹ࢖༻͢ΔͷΛආ ͚Δ ʮAPI Λ࢖༻͍ͯ͠ΔϓϩάϥϚ͕͜ΕҎ্ͷ͜ͱ͕Ͱ͖ͳ ͍ͳΒ͹ɺνΣοΫ͞Εͳ͍ྫ֎ͷ΄͏͕ద੾Ͱ͠ΐ͏ɻʯ } catch (TheCheckedException e) { throw new AssertionError(); // ܾͯ͠ى͖Δ΂͖Ͱ͸ͳ͍ʂ } } catch (TheCheckedException e) { e.printStackTrace(); // ·͍͍͋΍ɺෛ͚ͩɻ System.exit(1); }

Slide 58

Slide 58 text

Kotlin ݕࠪྫ֎ͱඇݕࠪྫ֎Λ۠ผ͠ͳ͍ Java Kotlin public String read(String filename) throws IOException { … } fun read(filename: String): String? { … }

Slide 59

Slide 59 text

class MainActivity : AppCompatActivity() { private fun versionName(): String { return packageManager.getPackageInfo(packageName, 0) .versionName } } public class MainActivity extends AppCompatActivity { private String versionName() { try { return getPackageManager() .getPackageInfo(getPackageName(), 0) .versionName; } catch (PackageManager.NameNotFoundException e) { // ͜͜ʹ͸དྷͳ͍͸ͣ return ""; } } } Java Kotlin

Slide 60

Slide 60 text

·ͱΊ • Effective Java ͷଟ͘ͷ߲໨ʹ͍ͭͯɺKotlin Ͱ͸ݴޠ࢓ ༷ͰରԠ͍ͯ͠Δ • Kotlin ʹॻ͖׵͑Δ͜ͱͰɺʮ໌ྎͰɺਖ਼͘͠ɺ࠶ར༻Մ ೳͰɺؤڧͰɺॊೈੑ͕͋ΓɺอकՄೳͳϓϩάϥϜΛॻ ͘ʯΤοηϯε͕ࣗવͱऔΓೖΕΒΕΔ

Slide 61

Slide 61 text

͓ΘΓ • blog : Y.A.M ͷࡶهா • y-anz-m.blogspot.com • twitter : @yanzm ʢ΍Μ͟Ήʣ • uPhyca Inc. (גࣜձࣾ΢ϑΟΧ)