在 Kotlin Android 中将值传递给函数时进行编译时间检查

Posted

技术标签:

【中文标题】在 Kotlin Android 中将值传递给函数时进行编译时间检查【英文标题】:Compile time check while passing values to a function in Kotlin Android 【发布时间】:2020-02-13 07:45:59 【问题描述】:

我将 JSON 文件作为类的输入,并使用 gson 通过相应的数据类解析值。

我想调用一个以String 值作为参数的函数。

允许的字符串值由从JSON 文件解析的值决定。我可以以某种方式检查在编译时传递给函数的字符串值并在编译时给出错误吗?

或者如果我可以根据 JSON 中的值在函数的参数中只允许某些值

用例详解:

我正在构建一个 SDK,其中使用 sdk 的人输入 json 字符串。 json 是标准化的,并在我的代码中进行了解析。


    "name": "Test",
    "objects": [
        
            "name": "object1",
            "type": "object1"
         
      ]

这里的名称值和其他值可能会根据开发人员使用它的输入而有所不同,但密钥保持不变。但是我们需要使用对象名称参数中的值来调用函数。

fun testMethod(objectName:String)

因此开发人员将 testMethod 称为testMethod(object1)

我需要基于 json 验证 object1 参数,但是如果开发人员调用 testMethod(obj1),是否可以将测试方法参数限制为仅 object1 并在编译时出错

现在我解析 JSON 并检查 testMethod()

【问题讨论】:

考虑到您在运行时解析 JSON,您的要求听起来不合理? @EpicPandaForce json 在编译时传递,这是我正在制作的一种 SDK 如果 JSON 在编译时已知,您可能可以为它制作一个 android Studio 插件。我高度怀疑您的用例有更好的解决方案,但不涉及 JSON。如果您与我们分享您的问题的更多细节,我们也许可以帮助您解决这个问题。 @Enselic 我已经编辑了我的问题。我希望现在很清楚。 听起来你需要的是编译时的 JSON 验证器,而不是 Kotlin/Java 解决方案;) 【参考方案1】:

当然可以,但以某种不同的方式,就像你描述的那样。首先,正如您已经提到的,这种行为可以很容易地完成。为此,我们有Objects.requireNotNull()Guava.Preconditions()。同样,您可以定义您的检查,但这仅适用于运行时。

要在编译时做,你需要创建 Annotation Preprocessor。与在不同库中所做的相同,其中之一可能是Lombok,以及它们的NotNullNullable。 Android 注释只是为 IDE 警告提供标记和绑定,但在他们的情况下,他们在编译时为每个注释使用添加了 NotNull 检查并抛出异常。

这不是一个简单的方法,但它就是您正在寻找的。

【讨论】:

【参考方案2】:

不,不可能在编译时检查它。它是字符串处理,作为数字计算。

在我的应用程序中,我将字符串转换为 JSON 并将 JSON 转换为字符串,并传递类描述符。我的目标是在文本文件中记录 JSON 字符串以加载到 SQLite 数据库中。这段代码是在我的台式电脑上运行的,而不是在 Android 中。

data class calcDescr (  
   ...
)
val calc = CalcDescr(...)

 //    toJson:  internal Kotlin data to JSON
val content = Gson().toJson(calc)   

  //==================
  // Testing validity
  // ================

 //    fromJson: JSON to internal Kotlin data. 
 // It needs pass the class descriptor. Uses *Java* token, but it's *Kotlin*
var testModel = Gson().fromJson(content, CalcDescr::class.java) 
 //    toJson:  internal Kotlin data to JSON again
var contentAgain = Gson().toJson(testModel)
//    shoul be equal!
if (content == contentAgain)  println("***ok***")

在我的文件中,我将变量content 写入一个文件

【讨论】:

以上是关于在 Kotlin Android 中将值传递给函数时进行编译时间检查的主要内容,如果未能解决你的问题,请参考以下文章

为什么在Kotlin中将变量传递给lambda有效?

无法在android中将值从一个类传递给另一个类

在android中将坐标传递给谷歌地图

在 android studio kotlin 中将数据从活动传递到片段(不重复,这些方法不起作用)

如何在 RxJava 2 和 Kotlin 中将 null 传递给具有可空类型的 Observable

如何在 mvc 视图中将剃刀值传递给 jquery 函数