Bpo1 Module 4
Bpo1 Module 4
Classes
The class declaration consists of the class name, the class header (specifying its type
parameters, the primary constructor etc.) and the class body, surrounded by curly
braces. Both the header and the body are optional; if the class has no body, curly
braces can be omitted.
class Empty
Constructors
A class in Kotlin can have a primary constructor and one or more secondary
constructors. The primary constructor is part of the class header: it goes after the class
name (and optional type parameters).
If the primary constructor does not have any annotations or visibility modifiers,
the constructor keyword can be omitted:
The primary constructor cannot contain any code. Initialization code can be placed
in initializer blocks, which are prefixed with the init keyword.
During an instance initialization, the initializer blocks are executed in the same order as
they appear in the class body, interleaved with the property initializers:
init {
println("First initializer block that prints ${name}")
}
Note that parameters of the primary constructor can be used in the initializer blocks.
They can also be used in property initializers declared in the class body:
In fact, for declaring properties and initializing them from the primary constructor, Kotlin
has a concise syntax:
class Person(val firstName: String, val lastName: String, var age: Int) { /*...*/ }
You can use a trailing comma when you declare class properties:
class Person(
val firstName: String,
val lastName: String,
var age: Int, // trailing comma
) { /*...*/ }
Much the same way as regular properties, the properties declared in the primary
constructor can be mutable (var) or read-only (val).
Secondary constructors
The class can also declare secondary constructors, which are prefixed
with constructor:
class Person {
var children: MutableList<Person> = mutableListOf()
constructor(parent: Person) {
parent.children.add(this)
}
}
If the class has a primary constructor, each secondary constructor needs to delegate to
the primary constructor, either directly or indirectly through another secondary
constructor(s). Delegation to another constructor of the same class is done using
the this keyword:
Note that code in initializer blocks effectively becomes part of the primary constructor.
Delegation to the primary constructor happens as the first statement of a secondary
constructor, so the code in all initializer blocks and property initializers is executed
before the secondary constructor body. Even if the class has no primary constructor, the
delegation still happens implicitly, and the initializer blocks are still executed:
class Constructors {
init {
println("Init block")
}
constructor(i: Int) {
println("Constructor")
}
}
If a non-abstract class does not declare any constructors (primary or secondary), it will
have a generated primary constructor with no arguments. The visibility of the
constructor will be public. If you do not want your class to have a public constructor, you
need to declare an empty primary constructor with non-default visibility:
NOTE: On the JVM, if all of the parameters of the primary constructor have default
values, the compiler will generate an additional parameterless constructor which will use
the default values. This makes it easier to use Kotlin with libraries such as Jackson or
JPA that create class instances through parameterless constructors.
class Customer(val customerName: String = "")
Creating instances of classes
Class members
Inheritance
All classes in Kotlin have a common superclass Any, that is the default superclass for a
class with no supertypes declared:
Any has three methods: equals(), hashCode() and toString(). Thus, they are
defined for all Kotlin classes.
By default, Kotlin classes are final: they can’t be inherited. To make a class inheritable,
mark it with the open keyword.
To declare an explicit supertype, place the type after a colon in the class header:
If the derived class has no primary constructor, then each secondary constructor has to
initialize the base type using the super keyword, or to delegate to another constructor
which does that. Note that in this case different secondary constructors can call different
constructors of the base type:
Overriding methods
As we mentioned before, we stick to making things explicit in Kotlin. So, Kotlin requires
explicit modifiers for overridable members (we call them open) and for overrides:
The override modifier is required for Circle.draw(). If it were missing, the compiler
would complain. If there is no open modifier on a function, like Shape.fill(), declaring
a method with the same signature in a subclass is illegal, either with override or
without it. The open modifier has no effect when added on members of a final class (i.e..
a class with no open modifier).
You can also override a val property with a var property, but not vice versa. This is
allowed because a val property essentially declares a get method, and overriding it as
a var additionally declares a set method in the derived class.
Note that you can use the override keyword as part of the property declaration in a
primary constructor.
interface Shape {
val vertexCount: Int
}
During construction of a new instance of a derived class, the base class initialization is
done as the first step (preceded only by evaluation of the arguments for the base class
constructor) and thus happens before the initialization logic of the derived class is run.
class Derived(
name: String,
val lastName: String,
) : Base(name.capitalize().also { println("Argument for Base: $it") }) {
It means that, by the time of the base class constructor execution, the properties
declared or overridden in the derived class are not yet initialized. If any of those
properties are used in the base class initialization logic (either directly or indirectly,
through another overridden open member implementation), it may lead to incorrect
behavior or a runtime failure. When designing a base class, you should therefore avoid
using open members in the constructors, property initializers, and init blocks.
Code in a derived class can call its superclass functions and property accessors
implementations using the super keyword:
Inside an inner class, accessing the superclass of the outer class is done with
the super keyword qualified with the outer class name: super@Outer:
class FilledRectangle: Rectangle() {
override fun draw() {
val filler = Filler()
filler.drawAndFill()
}
Overriding rules
interface Polygon {
fun draw() { /* ... */ } // interface members are 'open' by default
}
Abstract classes
A class and some of its members may be declared abstract. An abstract member
does not have an implementation in its class. Note that we do not need to annotate an
abstract class or function with open – it goes without saying.
Declaring Properties
Properties in Kotlin classes can be declared either as mutable using the var keyword,
or as read-only using the val keyword.
class Address {
var name: String = "Holmes, Sherlock"
var street: String = "Baker"
var city: String = "London"
var state: String? = null
var zip: String = "123456"
}
To use a property, simply refer to it by name:
We can define custom accessors for a property. If we define a custom getter, it will be
called every time we access the property (this allows us to implement a computed
property). Here's an example of a custom getter:
Interfaces
interface MyInterface {
fun bar()
fun foo() {
// optional body
}
}
Implementing Interfaces
Properties in Interfaces
You can declare properties in interfaces. A property declared in an interface can either
be abstract, or it can provide implementations for accessors. Properties declared in
interfaces can't have backing fields, and therefore accessors declared in interfaces can't
reference them.
interface MyInterface {
val prop: Int // abstract
fun foo() {
print(prop)
}
}
Interfaces Inheritance
An interface can derive from other interfaces and thus both provide implementations for
their members and declare new functions and properties. Quite naturally, classes
implementing such an interface are only required to define the missing implementations:
interface Named {
val name: String
}
Object expressions
To create an object of an anonymous class that inherits from some type (or types), we
write:
window.addMouseListener(object : MouseAdapter() {
override fun mouseClicked(e: MouseEvent) { /*...*/ }
interface B { /*...*/ }
fun foo() {
val adHoc = object {
var x: Int = 0
var y: Int = 0
}
print(adHoc.x + adHoc.y)
}
Note that anonymous objects can be used as types only in local and private
declarations. If you use an anonymous object as a return type of a public function or the
type of a public property, the actual type of that function or property will be the declared
supertype of the anonymous object, or Any if you didn't declare any supertype.
Members added in the anonymous object will not be accessible.
class C {
// Private function, so the return type is the anonymous object type
private fun foo() = object {
val x: String = "x"
}
fun bar() {
val x1 = foo().x // Works
val x2 = publicFoo().x // ERROR: Unresolved reference 'x'
}
}
The code in object expressions can access variables from the enclosing scope.
window.addMouseListener(object : MouseAdapter() {
override fun mouseClicked(e: MouseEvent) {
clickCount++
}
Object declarations
Singleton may be useful in several cases, and Kotlin (after Scala) makes it easy to
declare singletons:
object DataProviderManager {
fun registerDataProvider(provider: DataProvider) {
// ...
}
DataProviderManager.registerDataProvider(...)
Companion Objects
An object declaration inside a class can be marked with the companion keyword:
class MyClass {
companion object Factory {
fun create(): MyClass = MyClass()
}
}
Members of the companion object can be called by using simply the class name as the
qualifier:
val x = MyClass.Companion
The name of a class used by itself (not as a qualifier to another name) acts as a
reference to the companion object of the class (whether named or not):
class MyClass1 {
companion object Named { }
}
val x = MyClass1
class MyClass2 {
companion object { }
}
val y = MyClass2
Note that, even though the members of companion objects look like static members in
other languages, at runtime those are still instance members of real objects, and can,
for example, implement interfaces:
interface Factory<T> {
fun create(): T
}
class MyClass {
companion object : Factory<MyClass> {
override fun create(): MyClass = MyClass()
}
}
There is one important semantic difference between object expressions and object
declarations:
• object expressions are executed (and initialized) immediately, where they
are used;
• object declarations are initialized lazily, when accessed for the first time;
• a companion object is initialized when the corresponding class is loaded
(resolved), matching the semantics of a Java static initializer.
Object Expressions and Declarations
Object expressions
To create an object of an anonymous class that inherits from some type (or types), we
write:
window.addMouseListener(object : MouseAdapter() {
override fun mouseClicked(e: MouseEvent) { /*...*/ }
interface B { /*...*/ }
fun foo() {
val adHoc = object {
var x: Int = 0
var y: Int = 0
}
print(adHoc.x + adHoc.y)
}
Note that anonymous objects can be used as types only in local and private
declarations. If you use an anonymous object as a return type of a public function or the
type of a public property, the actual type of that function or property will be the declared
supertype of the anonymous object, or Any if you didn't declare any supertype.
Members added in the anonymous object will not be accessible.
class C {
// Private function, so the return type is the anonymous object type
private fun foo() = object {
val x: String = "x"
}
fun bar() {
val x1 = foo().x // Works
val x2 = publicFoo().x // ERROR: Unresolved reference 'x'
}
}
The code in object expressions can access variables from the enclosing scope.
window.addMouseListener(object : MouseAdapter() {
override fun mouseClicked(e: MouseEvent) {
clickCount++
}
Object declarations
Singleton may be useful in several cases, and Kotlin (after Scala) makes it easy to
declare singletons:
object DataProviderManager {
fun registerDataProvider(provider: DataProvider) {
// ...
}
DataProviderManager.registerDataProvider(...)
Companion Objects
An object declaration inside a class can be marked with the companion keyword:
class MyClass {
companion object Factory {
fun create(): MyClass = MyClass()
}
}
Members of the companion object can be called by using simply the class name as the
qualifier:
val x = MyClass.Companion
The name of a class used by itself (not as a qualifier to another name) acts as a
reference to the companion object of the class (whether named or not):
class MyClass1 {
companion object Named { }
}
val x = MyClass1
class MyClass2 {
companion object { }
}
val y = MyClass2
Note that, even though the members of companion objects look like static members in
other languages, at runtime those are still instance members of real objects, and can,
for example, implement interfaces:
interface Factory<T> {
fun create(): T
}
class MyClass {
companion object : Factory<MyClass> {
override fun create(): MyClass = MyClass()
}
}
There is one important semantic difference between object expressions and object
declarations:
• object expressions are executed (and initialized) immediately, where they
are used;
• object declarations are initialized lazily, when accessed for the first time;
• a companion object is initialized when the corresponding class is loaded
(resolved), matching the semantics of a Java static initializer.
MODULE 2
Mobile Application Development 1
Subtopic 2
OBJECTS
• Understand the concept of Objects
• Write program that uses objects
• Know the different applications of objects
To create an object of an anonymous class that inherits
from some type (or types), we write:
window.addMouseListener(object : MouseAdapter() {
override fun mouseClicked(e: MouseEvent) { /*...*/ }
override fun mouseEntered(e: MouseEvent) { /*...*/ }
})
If a supertype has a open class A(x: Int) {
constructor, appropriate public open val y: Int = x
constructor parameters }
must be passed to it.
Many supertypes may interface B { /*...*/ }
be specified as a
val ab: A = object : A(1), B {
comma-separated list
override val y = 15
after the colon: }
If, by any chance, we need "just an object", with no
nontrivial supertypes, we can simply say:
fun foo() {
val adHoc = object {
var x: Int = 0
var y: Int = 0
}
print(adHoc.x + adHoc.y)
}
Anonymous objects can be used as types only in local
and private declarations. If you use an anonymous
object as a return type of a public function or the type of
a public property, the actual type of that function or
property will be the declared supertype of the
anonymous object, or Any if you didn't declare any
supertype. Members added in the anonymous object will
not be accessible. (See next slide for sample code)
class C {
// Private function, so the return type is the anonymous object type
private fun foo() = object {
val x: String = "x“
}
// Public function, so the return type is Any
fun publicFoo() = object {
val x: String = "x“
}
fun bar() {
val x1 = foo().x // Works
val x2 = publicFoo().x // ERROR: Unresolved reference 'x’
}
}
The code in fun countClicks(window: JComponent) {
var clickCount = 0
object var enterCount = 0
expressions window.addMouseListener(object : MouseAdapter() {
can access override fun mouseClicked(e: MouseEvent) {
clickCount++
variables from }
the enclosing override fun mouseEntered(e: MouseEvent) {
enterCount++
scope. }
})
// ...
}
Singleton may
object DataProviderManager {
be useful in fun registerDataProvider(provider: DataProvider) {
several cases, // ...
and Kotlin }
(after Scala) val allDataProviders: Collection<DataProvider>
makes it easy get() = // ...
to declare }
singletons:
What you see in the code in previous slide is called an
object declaration, and it always has a name following
the object keyword. Just like a variable declaration, an
object declaration is not an expression, and cannot be
used on the right hand side of an assignment statement.
An object declaration inside a class can be marked with
the companion keyword:
class MyClass {
companion object Factory {
fun create(): MyClass = MyClass()
}
}
Members of the companion object can be called by using
simply the class name as the qualifier:
val instance = MyClass.create()
The name of the companion object can be omitted, in
which case the name Companion will be used:
class MyClass {
companion object { }
}
val x = MyClass.Companion
The name of a class class MyClass1 {
used by itself (not as a companion object Named { }
qualifier to another }
name) acts as a
reference to the val x = MyClass1class MyClass2 {
companion object of the companion object { }
class (whether named or }
not):
val y = MyClass2
Even though the interface Factory<T> {
members of companion fun create(): T
objects look like static }
members in other
languages, at runtime class MyClass {
those are still instance companion object : Factory<MyClass> {
members of real override fun create(): MyClass = MyClass()
objects, and can, for }
example, implement }
interfaces: val f: Factory<MyClass> = MyClass
• Griffiths, D., Griffiths, D. (2019). Head First Kotlin. O'Reilly Media, Inc.
• Jemerov, D., and Isakova, S. (2017). Kotlin in Action. Manning Publications
• Horton, J. (2018). Android Programming for Beginners: Build in-depth, full-featured Android 9 Pie apps starting from
zero programming experience, 2nd Edition. Packt Publishing
• Franceschi, H. J. (2018). Android App Development 1st Edition.
• Iversen, J., Eierman, M. (2018). Mobile App Development for iOS and Android, Edition 2.0. Prospect Press, Inc.
• Phillips, B., Stewart, C., Marsicano, K. (2017). Android Programming: The Big Nerd Ranch Guide (3rd Edition) (Big Nerd
Ranch Guides) 3rd Edition.
• Dawn, G. (2017). Head First Android Development: A Brain-Friendly Guide. O' Reilly Media, Inc.
• Drongelen, M., Dennis, A., Garabedian, R. (2017). Lean Mobile App Development: Apply Lean startup methodologies to
develop successful iOS and Android apps. Packt Publishing
• Miller, C. (2016), Cross-platform Localization for Native Mobile Apps with Xamarin
• Beer, Paula(2015), Hello app inventor: android programming for kids and the rest of us.
• Deborah Gonzalez (2015), Managing Online Risk: Apps, Mobile, And Social Media Security
Online Sources:
https://kotlinlang.org/docs/reference/
http://www.developer.android.com
http://www.android.com
http://www.onefeu.instructure.com
Classes and Inheritance
Classes
The class declaration consists of the class name, the class header (specifying its type
parameters, the primary constructor etc.) and the class body, surrounded by curly
braces. Both the header and the body are optional; if the class has no body, curly
braces can be omitted.
class Empty
Constructors
A class in Kotlin can have a primary constructor and one or more secondary
constructors. The primary constructor is part of the class header: it goes after the class
name (and optional type parameters).
If the primary constructor does not have any annotations or visibility modifiers,
the constructor keyword can be omitted:
The primary constructor cannot contain any code. Initialization code can be placed
in initializer blocks, which are prefixed with the init keyword.
During an instance initialization, the initializer blocks are executed in the same order as
they appear in the class body, interleaved with the property initializers:
init {
println("First initializer block that prints ${name}")
}
Note that parameters of the primary constructor can be used in the initializer blocks.
They can also be used in property initializers declared in the class body:
In fact, for declaring properties and initializing them from the primary constructor, Kotlin
has a concise syntax:
class Person(val firstName: String, val lastName: String, var age: Int) { /*...*/ }
You can use a trailing comma when you declare class properties:
class Person(
val firstName: String,
val lastName: String,
var age: Int, // trailing comma
) { /*...*/ }
Much the same way as regular properties, the properties declared in the primary
constructor can be mutable (var) or read-only (val).
Secondary constructors
The class can also declare secondary constructors, which are prefixed
with constructor:
class Person {
var children: MutableList<Person> = mutableListOf()
constructor(parent: Person) {
parent.children.add(this)
}
}
If the class has a primary constructor, each secondary constructor needs to delegate to
the primary constructor, either directly or indirectly through another secondary
constructor(s). Delegation to another constructor of the same class is done using
the this keyword:
Note that code in initializer blocks effectively becomes part of the primary constructor.
Delegation to the primary constructor happens as the first statement of a secondary
constructor, so the code in all initializer blocks and property initializers is executed
before the secondary constructor body. Even if the class has no primary constructor, the
delegation still happens implicitly, and the initializer blocks are still executed:
class Constructors {
init {
println("Init block")
}
constructor(i: Int) {
println("Constructor")
}
}
If a non-abstract class does not declare any constructors (primary or secondary), it will
have a generated primary constructor with no arguments. The visibility of the
constructor will be public. If you do not want your class to have a public constructor, you
need to declare an empty primary constructor with non-default visibility:
NOTE: On the JVM, if all of the parameters of the primary constructor have default
values, the compiler will generate an additional parameterless constructor which will use
the default values. This makes it easier to use Kotlin with libraries such as Jackson or
JPA that create class instances through parameterless constructors.
class Customer(val customerName: String = "")
Creating instances of classes
Class members
Inheritance
All classes in Kotlin have a common superclass Any, that is the default superclass for a
class with no supertypes declared:
Any has three methods: equals(), hashCode() and toString(). Thus, they are
defined for all Kotlin classes.
By default, Kotlin classes are final: they can’t be inherited. To make a class inheritable,
mark it with the open keyword.
To declare an explicit supertype, place the type after a colon in the class header:
If the derived class has no primary constructor, then each secondary constructor has to
initialize the base type using the super keyword, or to delegate to another constructor
which does that. Note that in this case different secondary constructors can call different
constructors of the base type:
Overriding methods
As we mentioned before, we stick to making things explicit in Kotlin. So, Kotlin requires
explicit modifiers for overridable members (we call them open) and for overrides:
The override modifier is required for Circle.draw(). If it were missing, the compiler
would complain. If there is no open modifier on a function, like Shape.fill(), declaring
a method with the same signature in a subclass is illegal, either with override or
without it. The open modifier has no effect when added on members of a final class (i.e..
a class with no open modifier).
You can also override a val property with a var property, but not vice versa. This is
allowed because a val property essentially declares a get method, and overriding it as
a var additionally declares a set method in the derived class.
Note that you can use the override keyword as part of the property declaration in a
primary constructor.
interface Shape {
val vertexCount: Int
}
During construction of a new instance of a derived class, the base class initialization is
done as the first step (preceded only by evaluation of the arguments for the base class
constructor) and thus happens before the initialization logic of the derived class is run.
class Derived(
name: String,
val lastName: String,
) : Base(name.capitalize().also { println("Argument for Base: $it") }) {
It means that, by the time of the base class constructor execution, the properties
declared or overridden in the derived class are not yet initialized. If any of those
properties are used in the base class initialization logic (either directly or indirectly,
through another overridden open member implementation), it may lead to incorrect
behavior or a runtime failure. When designing a base class, you should therefore avoid
using open members in the constructors, property initializers, and init blocks.
Code in a derived class can call its superclass functions and property accessors
implementations using the super keyword:
Inside an inner class, accessing the superclass of the outer class is done with
the super keyword qualified with the outer class name: super@Outer:
class FilledRectangle: Rectangle() {
override fun draw() {
val filler = Filler()
filler.drawAndFill()
}
Overriding rules
interface Polygon {
fun draw() { /* ... */ } // interface members are 'open' by default
}
Abstract classes
A class and some of its members may be declared abstract. An abstract member
does not have an implementation in its class. Note that we do not need to annotate an
abstract class or function with open – it goes without saying.
Declaring Properties
Properties in Kotlin classes can be declared either as mutable using the var keyword,
or as read-only using the val keyword.
class Address {
var name: String = "Holmes, Sherlock"
var street: String = "Baker"
var city: String = "London"
var state: String? = null
var zip: String = "123456"
}
To use a property, simply refer to it by name:
We can define custom accessors for a property. If we define a custom getter, it will be
called every time we access the property (this allows us to implement a computed
property). Here's an example of a custom getter:
Interfaces
interface MyInterface {
fun bar()
fun foo() {
// optional body
}
}
Implementing Interfaces
Properties in Interfaces
You can declare properties in interfaces. A property declared in an interface can either
be abstract, or it can provide implementations for accessors. Properties declared in
interfaces can't have backing fields, and therefore accessors declared in interfaces can't
reference them.
interface MyInterface {
val prop: Int // abstract
fun foo() {
print(prop)
}
}
Interfaces Inheritance
An interface can derive from other interfaces and thus both provide implementations for
their members and declare new functions and properties. Quite naturally, classes
implementing such an interface are only required to define the missing implementations:
interface Named {
val name: String
}
interface Polygon {
fun draw() { /* ... */ } // interface members are 'open' by default
}
class Square() : Rectangle(), Polygon {
// The compiler requires draw() to be overridden:
override fun draw() {
super<Rectangle>.draw() // call to Rectangle.draw()
super<Polygon>.draw() // call to Polygon.draw()
}
}
A class and some of its members may be declared
abstract. An abstract member does not have an
implementation in its class. Note that we do not need to
annotate an abstract class or function with open – it
goes without saying.
We can override a non-abstract open member with an
abstract one:
open class Polygon {
open fun draw() {}
}
interface MyInterface {
fun bar()
fun foo() {
// optional body
}
}
A class or object can implement one or more interfaces:
Online Sources:
https://kotlinlang.org/docs/reference/
http://www.developer.android.com
http://www.android.com
http://www.onefeu.instructure.com
Mobile Application
Development 1
Module 2
CLASSES AND OBJECTS
• Understand the concept of Classes
• Write program that uses classes
• Know the different applications of classes
• Understand the concept of Objects
• Write program that uses objects
• Know the different applications of objects
Classes in Kotlin are declared using the keyword class:
interface Polygon {
fun draw() { /* ... */ } // interface members are 'open' by default
}
class Square() : Rectangle(), Polygon {
// The compiler requires draw() to be overridden:
override fun draw() {
super<Rectangle>.draw() // call to Rectangle.draw()
super<Polygon>.draw() // call to Polygon.draw()
}
}
A class and some of its members may be declared
abstract. An abstract member does not have an
implementation in its class. Note that we do not need to
annotate an abstract class or function with open – it
goes without saying.
We can override a non-abstract open member with an
abstract one:
open class Polygon {
open fun draw() {}
}
interface MyInterface {
fun bar()
fun foo() {
// optional body
}
}
A class or object can implement one or more interfaces:
class MyClass {
companion object Factory {
fun create(): MyClass = MyClass()
}
}
Members of the companion object can be called by using
simply the class name as the qualifier:
val instance = MyClass.create()
The name of the companion object can be omitted, in
which case the name Companion will be used:
class MyClass {
companion object { }
}
val x = MyClass.Companion
The name of a class class MyClass1 {
used by itself (not as a companion object Named { }
qualifier to another }
name) acts as a
reference to the val x = MyClass1class MyClass2 {
companion object of the companion object { }
class (whether named or }
not):
val y = MyClass2
Even though the interface Factory<T> {
members of companion fun create(): T
objects look like static }
members in other
languages, at runtime class MyClass {
those are still instance companion object : Factory<MyClass> {
members of real override fun create(): MyClass = MyClass()
objects, and can, for }
example, implement }
interfaces: val f: Factory<MyClass> = MyClass
• Griffiths, D., Griffiths, D. (2019). Head First Kotlin. O'Reilly Media, Inc.
• Jemerov, D., and Isakova, S. (2017). Kotlin in Action. Manning Publications
• Horton, J. (2018). Android Programming for Beginners: Build in-depth, full-featured Android 9 Pie apps starting from
zero programming experience, 2nd Edition. Packt Publishing
• Franceschi, H. J. (2018). Android App Development 1st Edition.
• Iversen, J., Eierman, M. (2018). Mobile App Development for iOS and Android, Edition 2.0. Prospect Press, Inc.
• Phillips, B., Stewart, C., Marsicano, K. (2017). Android Programming: The Big Nerd Ranch Guide (3rd Edition) (Big Nerd
Ranch Guides) 3rd Edition.
• Dawn, G. (2017). Head First Android Development: A Brain-Friendly Guide. O' Reilly Media, Inc.
• Drongelen, M., Dennis, A., Garabedian, R. (2017). Lean Mobile App Development: Apply Lean startup methodologies to
develop successful iOS and Android apps. Packt Publishing
• Miller, C. (2016), Cross-platform Localization for Native Mobile Apps with Xamarin
• Beer, Paula(2015), Hello app inventor: android programming for kids and the rest of us.
• Deborah Gonzalez (2015), Managing Online Risk: Apps, Mobile, And Social Media Security
Online Sources:
https://kotlinlang.org/docs/reference/
http://www.developer.android.com
http://www.android.com
http://www.onefeu.instructure.com