首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

细微之处见真章之是否要给某些类型的属性赋默认值?

一、背景 今天技术群里有朋友问:“是否需要为对象里的集合赋默认值?会不会有问题?默认空集合是不是上游就可以不用 CollectionUtils 判空,代码更简洁?”...二、结论 2.1 要结合具体情况看 比如有些对象没有值时,给一个没有任何属性空对象,很容易导致一些副作用 如果是集合,没有值给空集合通常如果没有副作用,尤其是在当前类中使用,可以给默认集合。...2.2 编程习惯很重要 不管底层是否给了默认值,建议上游统一使用 CollectionUtils 对集合判空。...话虽如此,但常在河边走哪有不湿鞋,稍有一次不留神就可能导致线上空指针。 何必给自己找麻烦呢? 直接使用 Objects#equals 或者 常量在左侧万无一失。...三、总结 是否要给某些属性赋值默认值,要评估清楚是否会有副作用。 其次,如果单纯为了少一个判断给出默认值,没有必要。 作为接口的提供方,如果没有副作用的情况下可以给默认值。

51820
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【Kotlin】空安全 ① ( Kotlin 的空安全机制 | 变量可空性 | 默认变量不可赋空值 | 声明可空类型变量 )

    文章目录 一、Kotlin 的空安全机制 二、变量可空性 1、默认变量不可赋空值 2、声明可空类型变量 一、Kotlin 的空安全机制 ---- Java 中的空指针问题 : 在 Java 语言...Kotlin 程序的 代码健壮性 ; 二、变量可空性 ---- 1、默认变量不可赋空值 在 Java 中 , 引用类型的变量 默认为 null 空值 ; 但是在 Kotlin 中 , 变量默认不可为...null 空值 , 这样所有的 变量 在默认状态下 , 都有一个 默认的实例对象 , 从而极大的 减少了 空指针异常 出现的概率 ; 代码示例 : 先定义一个 name 变量 , 为其赋值字符串 "Tom...赋值一个空值 , 除非 将该变量声明为 可空类型 ; 2、声明可空类型变量 声明可空类型变量 : 如果要声明一个 可空类型的变量 , 必须 声明该变量的具体的类型 , 并在该类型后添加 ?...可空类型 , 此时就可以为 该变量 赋值 null 值 ; fun main() { var name: String?

    1.9K20

    揭秘 SwiftData 的数据建模原理

    在 SwiftData 的数项改进中,用纯代码声明数据模型无疑给 Core Data 开发者留下了深刻印象。...其中,name 对应数据模型的 Attribute Name,keypath 为当前类型对应属性的 KeyPath,defaultValue对应属性在声明中设置的默认值(没有默认值,为 nil ),而...请注意,使用上述的 set 方法(例如:setValue)给属性设置新的值将会绕过 Observation 框架,属性订阅者将无法得到属性发生变化的通知(视图不会自动刷新)。...的一个属性对应到 NSManagedObject 的多个属性(当属性为复杂类型时),以及线程调度(确保线程安全)等任务。...modelContext:当前 PersistentModel 所注册的 ModelContext,在未通过 insert 进行注册前,该值为 nil 与 NSManagedObject 相比,SwiftData

    39520

    储存篇 - CoreData使用大全

    2、选择文件类型, 如下图: ? 3、设置文件名,如下图: ? 4、模型文件创建成功,会出现以后 ?...; } // 如果是想做更新操作:只要在更改了实体对象的属性后调用[context save:&error],就能将更改的数据同步到数据库 } 3、删:删除数据 /** 删除数据...这里有个坑,在Xcode8中,Codegen下拉选择框中增加了Class/Definition这一选项,而且是默认的预设值,这时候系统会自动帮我们这个实体创建了NSManagedObject子类,我们不需要再创建实体类...对.xcdatamodeld文件进行你想要的修改 创建NSPersistentStore的时候,options参数传一个dictionary,值如下: NSDictionary *options = [...但是不推荐直接拖源码到项目中,一是需要自己管理代码更新,另一个原因是,直接拖源码进项目是会报错的,修改起来很麻烦。 ?

    2.6K20

    【Vue3+TypeScript】CRM系统项目搭建之 — 关于拥抱 TypeScript 这件事【上】

    number{ return x + y } demo(100,200) demo(100,'200') //警告:类型“string”的参数不能赋给类型“number”的参数 demo(100,200,300...let a:object //a的值可以是任何【⾮原始值类型】,包括:对象、函数、数组等 // 以下代码,是将【⾮原始类型】赋给a,所以均⽆警告 a = {} a = {name:'张三'} a = [...1,3,5,7,9] a = function(){} // 以下代码,是将【原始类型】赋给a,有警告 a = null // 警告:不能将类型“null”分配给类型“object” a = undefined...let a:Object //a的值必须是Object的实例对象, // 以下代码,均⽆警告,因为给a赋的值,都是Object的实例对象 a = {} a = {name:'张三'} a = [1,3,5,7,9...{ name: string; }”的参数不能赋给类型“Demo”的参数 test('123') test({name:'张三',length:10}

    13010

    c#值类型与引用类型区别

    由于不能将值类型作为基类型来定义新的值类型或者新的引用类型,所以不应在值类型中引用任何新的虚方法。所以方法都不能是抽象的,所以方法都隐式密封(不可重写)。....由于不能将值类型作为基类型来定义新的值类型或者新的引用类型,所以不应在值类型中引用任何新的虚方法。所以方法都不能是抽象的,所以方法都隐式密封(不可重写)。.引用类型的变量包含堆中对象的地址。...引用类型的变量创建时默认初始化为null,表明当前不指向有效对象。试图使用null引用类型变量会抛出NullReferenceException异常。...相反,值类型的变量总是包含其基础类型的一个值,而且值类型的所有成员都初始化为0。值类型变量不是指针,访问值类型不可能抛出NullReferenceException异常。...CLR确实允许为值类型添加“可空”(nullability)标志。 将值类型变量赋给另一个值类型变量,会执行逐字段的复制。将引用类型的变量赋给另一个引用类型的变量只复制内存地址。

    80320

    「死磕」Core Data——入门

    情况2:在既有项目初始化Core Data Stack(需兼容iOS8、9、10等系统) 因为NSPersistentContainer不兼容iOS10之前的系统。...添加实体、实体的特性、关系示意图 坑:这里有个坑,在Xcode8中,Codegen下拉选择框中增加了Class/Definition这一选项,而且是默认的预设值,这时候系统会自动帮我们这个实体创建了NSManagedObject...但是这时候赋值(或者修改)一条数据,都是通过NSManagedObject类实例进行的(我们创建的实体,都是NSManagedObject类型的),类似如下: NSManagedObject *newUser...不直观,敲字符串也容易出错。所以,我们通常都会创建NSManagedObject的子类,用点语法直接进行存取操作。...Relationships也会生成对应的属性:「对多」关系是NSSet/NSOrderSet类型属性(本质是个集合),「对一」关系则是非集合的对象类型属性。

    1.1K20

    SwiftDataKit:让你在 SwiftData 中使用 Core Data 的高级功能

    其中,它基于 Swift 宏功能的数据模型创建机制、类型安全的谓词系统、依靠 Actor 实现的线程安全以及与 Observation[3] 框架的紧密结合,使得 SwiftData 更符合现代编程的需求...然而,可能是由于准备时间不足,当前版本的 SwiftData 还无法实现 Core Data 中的一些高级功能。这就给想尝试 SwiftData 的开发者带来了一定的困扰。...使用 SwiftDataKit 时有几点需要注意: 尽管未声明 Core Data 版本的数据模型类型,但可以用字符串方式访问 Entity 和属性。...默认情况下,SwiftData 中的模型类型名对应 Entity 名,变量名对应属性名。...不推荐使用 setPrimitiveValue(value:, forKey:)、value(forKey:) 等方式读写 NSManagedObject 属性数据,缺乏编译检查。

    33940

    Swift实践:使用CoreData完成一个通讯录存储

    这个系列要写多少篇还没有想好,大概也还是会从基本到高级的一个过渡。 第一篇通过一个通讯录实现数据库的读取。第二篇会存储更多类型的数据。 最终实现结果: CoreDataDemo.gif 1....image.png NSManagedObject是我们的数据模型,也就是我们存储的对象。这些对象都保存在NSManagedObjectContext中,每个存储对象都知道自己对应哪个上下文。...不然还要一开始分享很多其他的内容,看官们会觉得腻的。 但是,实际开发中不建议使用这种方式创建。通常情况下我们都会把生成的模板代码都删除的。...咱们这个Demo的需求里面只需要一个人名,所以就只设置了一个名字叫做name的属性,类型是String。 其他更多的属性类型,我们会在下面一篇文章分享。 3.3 查询本地数据 咦?..., insertInto: managedObectContext) // 步骤三:保存文本框中的值到person person.setValue(text, forKey

    1.8K40

    C语言的数据的强制类型转换

    将整型值赋给浮点型变量,数值不变,只将形式改为浮点形式, 即小数点后带若干个0。注意:赋值时的类型转换实际上是强制的。  ...● chr型数值赋给int型变量时, 一些编译程序不管其值大小都作正数处理,而另一些编译程序在转换时,若char型数据值大于127,就作为负数处理。...对于使用者来讲,如果原来char型数据取正值,转换后仍为正值;如果原来char型值可正可负,则转换后也仍然保持原值, 只是数据的内部表示形式有所不同  (4) int型与long型  ● long型数据赋给...) ,原值照赋,内部的存储方式不变,但外部值却可能改变。 ...● 将一个非unsigned整型数据赋给长度相同的unsigned型变量时, 内部存储形式不变,但外部表示时总是无符号的。

    1.2K20

    C#基础03

    防止了用户随意输入,输入时只需要选择相应的值。具有统一性。 注意:枚举类型的值不能取int型的值。枚举类型的实例化对象都可强制转换为int型(每个枚举值都存在一个默认编号从0开始)。...如果,参数是以out 形式传入的,那么在传入前可以不赋初值。但是在方法内对形参必须赋初值。 一定意义上,可以理解成在方法内部定义的变量赋初值不是在定义时赋值而是在调用的方法内部赋初值。...在方法中必须对out修饰的值必须赋值(这也导致了out一般只能用于传出值而不能传入值,因为参数没有赋初值,必须在方法内部赋初值而不能将参数的值赋给其他变量,这也是与ref 的区别所在)。...ref(引用传递,直接对内存地址进行操作) 可以理解既可以传入(传入参数时需要对参数赋初值,因此在方法内部可以将参数的值赋给其他变量,实现传入值的功能),也可以传出(改变参数的值后会方法外面的值也会改变与...改变值可以改变方法外的值 //这里与out 的区别就在于可以将参数的值赋给其他变量 int b = num; int c = nums

    14810

    Java一分钟之变量声明与初始化基础

    初始化 显式初始化:声明变量的同时赋予初始值,如上例。 默认初始化:若未显式初始化,Java会根据变量类型赋予默认值,如int为0,boolean为false等。...常见问题与易错点 问题1:类型不匹配 尝试将一个类型的值赋给另一个不兼容类型的变量,如: int num = 3.14; // 错误:不能将double类型赋给int 问题2:未初始化 忘记初始化变量,...尤其是成员变量,可能引起逻辑错误或默认值导致的意外行为。...} } 如何避免 明确类型:在声明变量时,确保类型与赋值的数据类型一致,必要时进行类型转换。...(String[] args) { // 局部变量,显式初始化 double pi = 3.14; // 错误示范(未展示编译错误):类型不匹配

    15710

    SwiftDataKit:让你在 SwiftData 中使用 Core Data 的高级功能

    其中,它基于 Swift 宏功能的数据模型创建机制、类型安全的谓词系统、依靠 Actor 实现的线程安全以及与 Observation[3] 框架的紧密结合,使得 SwiftData 更符合现代编程的需求...然而,可能是由于准备时间不足,当前版本的 SwiftData 还无法实现 Core Data 中的一些高级功能。这就给想尝试 SwiftData 的开发者带来了一定的困扰。...使用 SwiftDataKit 时有几点需要注意: 尽管未声明 Core Data 版本的数据模型类型,但可以用字符串方式访问 Entity 和属性。...默认情况下,SwiftData 中的模型类型名对应 Entity 名,变量名对应属性名。...不推荐使用 setPrimitiveValue(value:, forKey:)、value(forKey:) 等方式读写 NSManagedObject 属性数据,缺乏编译检查。

    33820

    TypeScript入门

    不能将类型 "string | Date" 分配给类型 “string”。 不能将类型 "Date" 分配给类型 “string"。..."number” 的参数不能赋给类型"string" 的参数 */ getStrArr(123); /* 泛型参数默认类型 */ type IGetRepeatArr = (...“string"的参数不能赋给类型"number" 的参数 */ getRepeatArr('123'); # 类型别名 & 类型断言 /* 通过 type 关键字定义了 I0bjArr 的别名类型...: 联合类型:IA │ IB;联合类型表示一个值可以是几种类型之一 交叉类型:IA & IB;多种类型叠加到一起成为一种类型,它包含了所需的所有类型的特性 type IBookList = Array类型 A: 类型 B // 关键字【infer】出现在类型推荐中,表示定义类型变量,可以用于指代类型 // 如该场景下,将函数的返回值类型作为变量,使用新泛型 R 表示,使用在类型推荐命中的结果中

    1.5K20

    同时搞定Android和iOS的Dart语言(3):数值类型

    一旦变量的数据类型确定为int,那么就不能将一个浮点数或其他类型的值赋给这个变量,例如,下面的代码会抛出编译错误。...int x = 20; //x = 12.4; // 抛出编译错误,无法将一个浮点数赋给一个int类型的变量 但可以将一个整数赋给一个double类型的变量,例如,下面的代码是正确的。...也就是说,如果将一个变量声明为num类型,那么该变量既可以赋int类型的值,也可以赋double类型的值,代码如下: num k = 20; k = 40.12;...void main() { // x的值是int类型能表示的最大整数值 int x = 9223372036854775807; print('x = $x'); // 输出x的位长度...var oneString = 1.toString(); // 将浮点数3.1415926转换为String类型的值 var piString = 3.1415926.toString(

    1.3K20

    C语言指针的初始化和赋值

    所以后面所示的做法是不行的: int *p = 0x12345678 ; 正确的方式应为:int *p = (int *) 0x12345678; 要注意指针中只能存放地址,不能将一个非0值整型常量表达式或者其他非地址类型的数据赋给一个指针...:一个具有0值的整形常量表达式,或者此类表达式被强制转换为void *类型,则称为空指针常量,它可以用来初始化或赋给任何类型的指针。...也就是说,我们可以将0、0L、’/0’、2–2、0*5以及(void *)0赋给一个任何类型的指针,此后这个指针就成为一个空指针,由系统保证空指针不指向任何对象或函数。...,如:int i = 3; int *ip = &i; 3.将一个指针常量赋给一个指针,如:long *p = (long *)0xfffffff0; 4.将一个T类型数组的名字赋给一个相同类型的指针...C语言中的malloc函数的返回值就是一个void *型指针,我们可以把它直接赋给一个其他类型的指针,但从安全的编程风格角度以及兼容性上讲,最好还是将返回的指针强制转换为所需的类型,另外,malloc在无法满足请求时会通过返回一个空指针来作为

    2.7K10
    领券