Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.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_Design Patterns_Builder Pattern - Fatal编程技术网

Kotlin 如何使用生成器模式构建嵌套列表?

Kotlin 如何使用生成器模式构建嵌套列表?,kotlin,design-patterns,builder-pattern,Kotlin,Design Patterns,Builder Pattern,我试图通过使用生成器模式为GraphQL语法创建一个查询生成器。我已经为过滤部分做过了: 我想通过编程说出我想从查询中获取哪些数据。(注意:在标题之前,部分查询已硬编码到QueryBuilder中 为此,我创建了一个名为Entity的类,它有一个自身列表作为属性 类实体( 私有val实体:EntityType, 私有val实体:MutableList=mutableListOf() ) { 重写funtostring():String{ 返回if(this.entities.isEmpty())

我试图通过使用生成器模式为GraphQL语法创建一个查询生成器。我已经为过滤部分做过了:

我想通过编程说出我想从查询中获取哪些数据。(注意:在
标题之前,
部分查询已硬编码到QueryBuilder中

为此,我创建了一个名为Entity的类,它有一个自身列表作为属性

类实体(
私有val实体:EntityType,
私有val实体:MutableList=mutableListOf()
) {
重写funtostring():String{
返回if(this.entities.isEmpty()){
实体.str
}否则{
this.entity.str+“{”+this.entities.onEach{
it.toString()
}.joinToString(“”+“}”
}
}
}
我让它开始工作。但是要构建结构。然后我必须附加到列表中,并“访问”实体列表以访问该列表中的实体

例如,如果我要生成此查询:

{
  events(place:"Somewhere", area:"The place"){
    title
    location{
      coordinates{
        longitude
        latitude
      }
    }
  }
}
然后我需要在实体的层中向下两层,我现在这样做,然后我的代码变得非常广泛

fun main(){
val e1=列表(
实体(EntityType.TITLE),
实体(EntityType.LOCATION,
可变列表(
实体(EntityType.COORDINATES,
可变列表(
实体(EntityType.LONGITUDE),
实体(EntityType.LATITUDE)
)
)
)
)
)
val q1=Query.Builder()
.filter(FilterType.PLACE,“某处”)
.filter(FilterType.AREA,“地点”)
.add(e1)
.build()
println(q1.query)
}
所以我想使用builder模式,或者其他更智能的模式

提前感谢您的帮助,祝您度过愉快的一天

顺便说一句:我正在使用以下枚举:

enum类EntityType(val str:String){
事件(“事件”),
标题(“标题”),
地点(“地点”),
坐标(“坐标”),
经度(“经度”),
纬度(“纬度”),
}
枚举类筛选器(val str:String){
地点(“地点”),
区域(“区域”),
}
我的其余代码如下所示:

类过滤器{
var filters=mutableMapOf()
重写funtostring():String{
返回if(filters.isNotEmpty()){
“(“+filters.map”{
if(it.value为Int | | it.value为Long){
it.key.str+“:“+it.value+”,”
}否则{
it.key.str+“:\”+it.value+“\”,“
}
}.joinToString(“”).dropLast(1)+“
}否则{
""
}
}
}
类查询专用构造函数(val查询:字符串){
类生成器{
私有lateinit var实体:列表
私有变量过滤器=过滤器()
乐趣过滤器(键:FilterType,值:Any)=应用{
this.filter.filters[key]=值
}
乐趣添加(实体:列表)=应用{
this.entities=实体
}
私人娱乐收集(根:字符串):字符串{
返回“{$root$filter{${entities.joinToString(“”}}}”
}
fun build():查询{
返回查询(收集(“事件”))
}
}

看一看。你可以找到一个关于如何为HTML做这件事的例子看一看。你可以找到一个关于如何为HTML做这件事的例子。我会看一看,你能称之为访问者模式吗?关于这一点,我现在有一个新问题:也许我应该写一篇新文章,但如果我想避免添加{}在边缘的情况下。有可能吗?:)非常感谢。我认为你的链接非常有用!不,标识符就是这样。你需要一些操作。根据你的风格,你可以用
+经度
代替
经度{}
,例如