【问题标题】:how can i deal with the static parameters and static functions in kotlin?如何处理 kotlin 中的静态参数和静态函数?
【发布时间】:2021-03-21 03:26:14
【问题描述】:
public class C {
  public static string a;
 public static string b;

public C(String a, String b){
this.a=a;
this.b=b;
}
public void addString(){
 String result=a+b;
}
public static JSONObjet functionA(){
JSONObject jsonobject = new JSONObject();
try { 
jsonobject.put(key1, a);
jsonobject.put(key2,b);
} catch(JsonException e){
******}
return jsonobject;}}

如果把参数放在init{}之前,那么functionA()就不能识别a和b。如果将参数放入伴随对象{}中,init 将无法识别 a 和 b。如何将此类转换为 kotlin?你有什么建议?

Class C{

     fun addString(){
     var result:String=a+b
    }
     init {
    this.a=a
    this.b=b
            }
        companion object {
       var a:String?=null
       var b:String?=null
       @JVMStatic
       fun functionA(): JSONObject?{
       var jsonobject = JSONObject()
    try { 
    jsonobject.put(key1, a)
    jsonobject.put(key2,b)
    } catch(JsonException e){
    ******}
    return jsonobject
    }}}

【问题讨论】:

  • Java 类本身有一种奇怪的设计。为什么类的每个任意实例都会覆盖相同的静态成员并且不携带自己的状态?
  • 你的实现问题不在于初始化的顺序。这是因为您的类没有显式构造函数,因此您没有可用于设置静态成员的变量。此外,您需要使用Companion.a 而不是this.a
  • 嗨,tenfour04,fun addString() 只是一个普通的方法示例,需要用到这两个静态参数。这个类有两个静态参数,几个非静态方法需要调用这两个静态参数。需要调用这两个静态参数的一种静态方法。还有一个构造函数。
  • 嗨,tenfour04,非常感谢您的建议。我会试试 Companion.a 和 Companion.b 看看。稍后更新,谢谢
  • 我的意思是为什么类会覆盖静态成员?现在,类的任何实例都不能保证静态成员是什么。它们可以是最近通过的实例。那么,如果它们与特定实例无关,为什么要首先通过构造函数传递它们呢?

标签: kotlin static-variables static-functions


【解决方案1】:

您的代码的严格等效项与您的代码类似,只是您缺少构造函数参数,并且您需要使用Companion 而不是this 来指定同伴的属性。

class C (a: String, b: String) {

    init {
        Companion.a = a
        Companion.b = b
    }

    companion object {
        @JvmField
        var a: String? = null
        @JvmField
        var b: String? = null

        @JvmStatic
        fun functionA(): JSONObject{
            val jsonObject = JSONObject()
            try {
                jsonObject.put(key1, a)
                jsonObject.put(key2, b)
            } catch (e: JsonException){
                //******
            }
            return jsonObject
        }
    }
}

虽然我必须说,我不能推荐这样的设计。这是对静态的令人讨厌的滥用。

【讨论】:

  • init { Companion.a = a Companion.b = b } 这个不起作用。必须通过其类调用使用 C.a=a C.b=b
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-03
  • 1970-01-01
  • 1970-01-01
  • 2016-09-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多