Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin 如何描述事件结构和获取信息?_Kotlin - Fatal编程技术网

Kotlin 如何描述事件结构和获取信息?

Kotlin 如何描述事件结构和获取信息?,kotlin,Kotlin,我想用kotlin编写一个DSL,描述事件存储中的事件,以根据这些描述生成Java代码、JSON示例、模式和文档。我目前的做法是: 保存事件结构的数据类MyEvent data class MyEvent(val name: String, val version: Int, val content: Map<String, String>) 而“String(1256)”则表示其类型为String,最少1个字符,最多256个字符 要迭代所有事件以生成所需的一切,我需要手动将每个事

我想用kotlin编写一个DSL,描述事件存储中的事件,以根据这些描述生成Java代码、JSON示例、模式和文档。我目前的做法是:

保存事件结构的数据类
MyEvent

data class MyEvent(val name: String, val version: Int, val content: Map<String, String>)
而“String(1256)”则表示其类型为
String
,最少1个字符,最多256个字符

要迭代所有事件以生成所需的一切,我需要手动将每个事件添加到列表/集合中

fun scanForAllMyEventsInstances(): Set<MyEvent> {
    return hashSetOf(OrderCreated, OrderCancelled, OrderQuestioned)
}
fun scanforAllMyEventInstances():设置{
返回hashSetOf(OrderCreated、OrderCancelled、OrderQuestion)
}
这种方式感觉不是最好的方式

  • 我不喜欢被迫在
    扫描AllMyEventInstances
    中添加新事件。我只想描述一个新的事件
  • 我不想为每个事件创建
    MyEvent
    的实例。这些都是“静态”信息
  • 所以我的问题是:你会怎么做?我想提出一些建议


    我现在使用的是
    SpringBoot
    。所以不要犹豫,建议使用框架。

    我认为enum类是您的朋友

    enum class MyEvent(val eventName: String, val version: Int, val content: Map<String, String>) {
        OrderCreated("OrderCreated", 1, mapOf("orderId" to "UUID", "nameOfProduct" to "String(1, 256)", "quantity" to "Integer")),
        OrderCancelled("OrderCancelled", 2, mapOf("orderId" to "UUID", "reason" to "String(100, 1000)")),
        OrderQuestioned("OrderQuestioned", 3, mapOf("orderId" to "UUID", "question" to "String(10, 1000)"))
    }
    

    使用enum类的方法,我添加了一个接口,以便可以组织大量(不同的)事件

    接口MyEvent2{
    val eventName:String
    val版本:Int
    val内容:地图
    }
    枚举类MyOrderEvents:MyEvent2{
    订单创建{
    覆盖val eventName=“OrderCreated”
    覆盖val版本=1
    覆盖val content=mapOf(“orderId”到“UUID”,“产品名称”到“String(1256)”,“quantity”到“Integer”)
    },
    订单取消{
    覆盖val eventName=“OrderCancelled”
    覆盖val版本=2
    覆盖val content=mapOf(“orderId”到“UUID”,“reason”到“String(1001000)”)
    },
    订单问题{
    覆盖val eventName=“orderQuestibled”
    覆盖val版本=3
    覆盖val content=mapOf(“orderId”到“UUID”,“question”到“String(101000)”)
    }
    }
    枚举类MyUserEvents:MyEvent2{
    用户创建{
    覆盖val eventName=“UserCreated”
    覆盖val版本=1
    重写val content=mapOf(“userId”到“UUID”,“name”到“String(1256)”)
    },
    用户删除{
    覆盖val eventName=“UserDeleted”
    覆盖val版本=2
    覆盖val content=mapOf(“userId”到“UUID”)
    },
    用户更改{
    覆盖val eventName=“UserChanged”
    覆盖val版本=3
    重写val content=mapOf(“userId”到“UUID”,“newName”到“String(1256)”)
    }
    }
    
    我仍然需要将每个枚举类添加到列表/集合中

    fun scanForAllMyEventsInstances(): Set<MyEvent2> {
        val allEvents = HashSet<MyEvent2>()
        allEvents.addAll(MyOrderEvents.values())
        allEvents.addAll(MyUserEvents.values())
        return allEvents
    }
    
    fun main() {
        scanForAllMyEventsInstances().forEach{e -> println(e.eventName)}
    }
    
    fun scanforAllMyEventInstances():设置{
    val allEvents=HashSet()
    allEvents.addAll(MyOrderEvents.values())
    allEvents.addAll(MyUserEvents.values())
    回程通道
    }
    主要内容(){
    scanforAllMyEventInstances().forEach{e->println(e.eventName)}
    }
    
    但每节课只上一次。该类中的每个新事件都会自动识别。对我来说没问题

    备注:使用枚举类时不应使用
    val name
    ,因为在枚举类中已定义值
    name
    。这就是为什么在
    MyEvent2
    中它被称为
    eventName
    。也许我甚至可以跳过
    name
    /
    eventName
    ,因为它与枚举名是1:1

    我要试试这个


    PS:我认为这仍然不是一个好的DSL。但是优化这个,我将在以后的任务中完成。

    这并不能回答这个问题。若要评论或要求作者澄清,请在其帖子下方留下评论。如果你足够的话,你就能做到。
    MyEvent.values().forEach { println(it.eventName) }
    
    interface MyEvent2 {
        val eventName: String
        val version: Int
        val content: Map<String, String>
    }
    
    enum class MyOrderEvents : MyEvent2 {
    
        OrderCreated {
            override val eventName = "OrderCreated"
            override val version = 1
            override val content = mapOf("orderId" to "UUID", "nameOfProduct" to "String(1, 256)", "quantity" to "Integer")
        },
    
        OrderCancelled {
            override val eventName = "OrderCancelled"
            override val version = 2
            override val content = mapOf("orderId" to "UUID", "reason" to "String(100, 1000)")
        },
    
        OrderQuestioned {
            override val eventName = "OrderQuestioned"
            override val version = 3
            override val content = mapOf("orderId" to "UUID", "question" to "String(10, 1000)")
        }
    
    }
    
    enum class MyUserEvents : MyEvent2 {
    
        UserCreated {
            override val eventName = "UserCreated"
            override val version = 1
            override val content = mapOf("userId" to "UUID", "name" to "String(1, 256)")
        },
    
        UserDeleted {
            override val eventName = "UserDeleted"
            override val version = 2
            override val content = mapOf("userId" to "UUID")
        },
    
        UserChanged {
            override val eventName = "UserChanged"
            override val version = 3
            override val content = mapOf("userId" to "UUID", "newName" to "String(1, 256)")
        }
    
    }
    
    fun scanForAllMyEventsInstances(): Set<MyEvent2> {
        val allEvents = HashSet<MyEvent2>()
        allEvents.addAll(MyOrderEvents.values())
        allEvents.addAll(MyUserEvents.values())
        return allEvents
    }
    
    fun main() {
        scanForAllMyEventsInstances().forEach{e -> println(e.eventName)}
    }