Function definition: fun vs val

Answer #1 100 %

Kotlin is all about Java interoperability and defining a function as a val will produce a completely different result in terms of the interoperability. The following Kotlin class:

class A {
  fun f(x: Int) = 42
  val g = fun(x: Int) = 42

is effectively equivalent to:

public class A {
  private final Function1 gref = new Function1() {
    public Integer invoke(final Integer integer) {
      return 42;

  public int f(final int value) {
    return 42;

  public Function1 getG() {
    return gref;

As you can see, the main differences are:

  1. fun f is just a usual method, while val g in fact is a higher-order function that returns another function
  2. val g involves creation of a new class which isn't good if you are targeting Android
  3. val g requires unnecessary boxing and unboxing
  4. val g cannot be easily invoked from java: A().g(42) in Kotlin vs new A().getG().invoke(42) in Java


Regarding the A::f syntax. The compiler will generate an extra Function2 class for every A::f occurrence, so the following code results in two extra classes with 7 methods each:

val first = A::f
val second = A::f

Kotlin compiler isn't smart enough at the moment to optimize such kind of things. You can vote for the issue here In case you are interested, here is how each class looks in the bytecode:

Tags: kotlin

You’ll also like:

© 2023 -