Constants in Kotlin — what's a recommended way to create them?

后端 未结 13 1152
不知归路
不知归路 2020-12-04 18:45

How is it recommended to create constants in Kotlin? And what\'s the naming convention? I\'ve not found that in the documentation.

companion object {
    //1         


        
相关标签:
13条回答
  • 2020-12-04 19:20

    You don't need a class, an object or a companion object for declaring constants in Kotlin. You can just declare a file holding all the constants (for example Constants.kt or you can also put them inside any existing Kotlin file) and directly declare the constants inside the file. The constants known at compile time must be marked with const.

    So, in this case, it should be:

    const val MY_CONST = "something"

    and then you can import the constant using:

    import package_name.MY_CONST

    You can refer to this link

    0 讨论(0)
  • 2020-12-04 19:21

    Values known at compile time can (and in my opinion should) be marked as constant.

    Naming conventions should follow Java ones and should be properly visible when used from Java code (it's somehow hard to achieve with companion objects, but anyway).

    The proper constant declarations are:

    const val MY_CONST = "something"
    const val MY_INT = 1
    
    0 讨论(0)
  • 2020-12-04 19:21

    Kotlin static and constant value & method declare

    object MyConstant {
    
    @JvmField   // for access in java code 
    val PI: Double = 3.14
    
    @JvmStatic // JvmStatic annotation for access in java code
    fun sumValue(v1: Int, v2: Int): Int {
        return v1 + v2
    }
    

    }

    Access value anywhere

    val value = MyConstant.PI
    val value = MyConstant.sumValue(10,5)
    
    0 讨论(0)
  • 2020-12-04 19:24

    If you put your const val valName = valValue before the class name, this way it will creates a

    public static final YourClass.Kt that will have the public static final values.

    Kotlin:

    const val MY_CONST0 = 0
    const val MY_CONST1 = 1
    data class MyClass(var some: String)
    

    Java decompiled:

    public final class MyClassKt {
        public static final int MY_CONST0 = 0;
        public static final int MY_CONST1 = 1;
    }
    // rest of MyClass.java
    
    0 讨论(0)
  • 2020-12-04 19:25

    Something that isn't mentioned in any of the answers is the overhead of using companion objects. As you can read here, companion objects are in fact objects and creating them consumes resources. In addition, you may need to go through more than one getter function every time you use your constant. If all that you need is a few primitive constants you'll probably just be better off using val to get a better performance and avoid the companion object.

    TL;DR; of the article:

    Using companion object actually turns this code

    class MyClass {
    
        companion object {
            private val TAG = "TAG"
        }
    
        fun helloWorld() {
            println(TAG)
        }
    }
    

    Into this code:

    public final class MyClass {
        private static final String TAG = "TAG";
        public static final Companion companion = new Companion();
    
        // synthetic
        public static final String access$getTAG$cp() {
            return TAG;
        }
    
        public static final class Companion {
            private final String getTAG() {
                return MyClass.access$getTAG$cp();
            }
    
            // synthetic
            public static final String access$getTAG$p(Companion c) {
                return c.getTAG();
            }
        }
    
        public final void helloWorld() {
            System.out.println(Companion.access$getTAG$p(companion));
        }
    }
    

    So try to avoid them.

    0 讨论(0)
  • 2020-12-04 19:26

    For primitives and Strings:

    /** The empty String. */
    const val EMPTY_STRING = ""
    

    For other cases:

    /** The empty array of Strings. */
    @JvmField val EMPTY_STRING_ARRAY = arrayOfNulls<String>(0)
    

    Example:

    /*
     * Copyright 2018 Vorlonsoft LLC
     *
     * Licensed under The MIT License (MIT)
     */
    
    package com.vorlonsoft.android.rate
    
    import com.vorlonsoft.android.rate.Constants.Utils.Companion.UTILITY_CLASS_MESSAGE
    
    /**
     * Constants Class - the constants class of the AndroidRate library.
     *
     * @constructor Constants is a utility class and it can't be instantiated.
     * @since       1.1.8
     * @version     1.2.1
     * @author      Alexander Savin
     */
    internal class Constants private constructor() {
        /** Constants Class initializer block. */
        init {
            throw UnsupportedOperationException("Constants$UTILITY_CLASS_MESSAGE")
        }
    
        /**
         * Constants.Date Class - the date constants class of the AndroidRate library.
         *
         * @constructor Constants.Date is a utility class and it can't be instantiated.
         * @since       1.1.8
         * @version     1.2.1
         * @author      Alexander Savin
         */
        internal class Date private constructor() {
            /** Constants.Date Class initializer block. */
            init {
                throw UnsupportedOperationException("Constants.Date$UTILITY_CLASS_MESSAGE")
            }
    
            /** The singleton contains date constants. */
            companion object {
                /** The time unit representing one year in days. */
                const val YEAR_IN_DAYS = 365.toShort()
            }
        }
    
        /**
         * Constants.Utils Class - the utils constants class of the AndroidRate library.
         *
         * @constructor Constants.Utils is a utility class and it can't be instantiated.
         * @since       1.1.8
         * @version     1.2.1
         * @author      Alexander Savin
         */
        internal class Utils private constructor() {
            /** Constants.Utils Class initializer block. */
            init {
                throw UnsupportedOperationException("Constants.Utils$UTILITY_CLASS_MESSAGE")
            }
    
            /** The singleton contains utils constants. */
            companion object {
                /** The empty String. */
                const val EMPTY_STRING = ""
                /** The empty array of Strings. */
                @JvmField val EMPTY_STRING_ARRAY = arrayOfNulls<String>(0)
                /** The part 2 of a utility class unsupported operation exception message. */
                const val UTILITY_CLASS_MESSAGE = " is a utility class and it can't be instantiated!"
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题