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

惯例问题:何时使用Getter/Setter函数而不是使用Property

在面向对象编程中,Getter和Setter函数是一种常见的编程模式,用于访问和修改对象的属性。它们通常用于实现数据封装和隐藏对象的内部实现细节。以下是关于何时使用Getter/Setter函数而不是使用Property的一些建议:

  1. 数据验证:当需要对属性值进行验证或转换时,可以使用Getter/Setter函数。例如,确保属性值在特定范围内,或将输入的字符串转换为特定的格式。
  2. 数据计算:当需要对属性值进行计算或派生时,可以使用Getter/Setter函数。例如,根据其他属性值计算出一个属性值,或将一个属性值转换为另一个属性值。
  3. 数据加密:当需要对属性值进行加密或解密时,可以使用Getter/Setter函数。例如,将敏感数据(如密码)加密存储,并在需要时解密。
  4. 懒加载:当需要按需加载属性值时,可以使用Getter/Setter函数。例如,从数据库中按需加载数据,而不是一次性加载所有数据。
  5. 依赖注入:当需要将对象的属性值与其他对象或服务解耦时,可以使用Getter/Setter函数。例如,将对象的依赖关系通过构造函数或属性注入,以便在需要时更改实现。

在某些情况下,使用Property可能更合适,例如当属性值不需要进行验证、计算或加密时,或者当对象的属性值不需要进行依赖注入时。在这些情况下,使用Property可以简化代码并提高可读性。

总之,何时使用Getter/Setter函数而不是使用Property取决于具体的需求和场景。在需要对属性值进行验证、计算、加密、懒加载或依赖注入时,使用Getter/Setter函数可能更合适。而在不需要进行这些操作时,使用Property可能更简单和直接。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

何时使用Elasticsearch不是MySql

MySQL 的查询语言是字符串形式的,需要拼接或转义特殊字符, Elasticsearch 的查询语言是 JSON 形式的,可以直接使用对象或数组表示。...MySQL 的索引是辅助的,需要手动创建和维护, Elasticsearch 的索引是主要的,自动创建和更新。...MySQL 的索引是局部的,只针对单个表或列, Elasticsearch 的索引是全局的,涵盖所有文档和字段。...为了解决这个问题,MySQL 提供了多种复制(replication)和集群(cluster)方案,例如主从复制(master-slave replication)、双主复制(master-master...使用场景 MySQL 和 Elasticsearch 适用于不同的使用场景,根据不同的业务需求,可以选择合适的数据库系统或组合使用两者。

28320
  • 何时使用MongoDB不是MySql

    MySQL 使用 GPL 协议,使得任何人均可以免费使用 MySQL 并且可以对其进行代码修改。... MonogoDB 在 2018 年 10 月 16 日更改 License 为 SSPL 协议,这对于开源社区没啥影响,但是对于云厂商而言 MongoDB 公司会明确要求托管 MongoDB 实例的云厂商要么从...MongoDB 和 MySQL 都有一个活跃的开发人员社区,可以回答问题并帮助进行故障排除。它们还提供企业版,针对特定要求提供专属支持。...副本还可能滞后于主副本,会造成一致性问题。纵向可扩展性也受限于单机性能瓶颈。 相比之下,MongoDB 在可扩展性方面具有显著的优势。...可扩展性 MongoDB 使用复制和分片进行水平扩展。 MySQL 使用纵向扩展和只读副本来大规模提高性能。 查询语言 MongoDB 使用 MongoDB 查询语言。 MySQL 使用 SQL。

    82920

    何时使用Elasticsearch不是MySql

    MySQL 的查询语言是字符串形式的,需要拼接或转义特殊字符, Elasticsearch 的查询语言是 JSON 形式的,可以直接使用对象或数组表示。...MySQL 的索引是辅助的,需要手动创建和维护, Elasticsearch 的索引是主要的,自动创建和更新。...MySQL 的索引是局部的,只针对单个表或列, Elasticsearch 的索引是全局的,涵盖所有文档和字段。...为了解决这个问题,MySQL 提供了多种复制(replication)和集群(cluster)方案,例如主从复制(master-slave replication)、双主复制(master-master...使用场景 MySQL 和 Elasticsearch 适用于不同的使用场景,根据不同的业务需求,可以选择合适的数据库系统或组合使用两者。

    57910

    何时使用Kafka不是RabbitMQ

    本文将比较 Kafka 和 RabbitMQ 的主要区别,并分析何时使用 Kafka 不是 RabbitMQ。 影响因素 可扩展性:Kafka 旨在处理大容量、高吞吐量和实时数据流。...数据流:Kafka 使用无界的数据流,即数据持续地流入到指定的主题(topic)中,不会被删除或过期,除非达到了预设的保留期限或容量限制。...RabbitMQ 使用有界的数据流,即数据被生产者(producer)创建并发送到消费者(consumer),一旦被消费或者达到了过期时间,就会从队列(queue)中删除。...数据使用:Kafka 支持多个消费者同时订阅同一个主题,并且可以根据自己的进度来消费数据,不会影响其他消费者。这意味着 Kafka 可以支持多种用途和场景,比如实时分析、日志聚合、事件驱动等。...总结 在公司项目中,一般并发请求量都不大的情况下,博主推荐大家根据公司内部对两种 MQ 的熟悉程度来进行选择,避免 MQ 出现问题时无法及时处理。 ·END·

    22910

    盘点JavaScript中getter()和setter()函数使用

    它们本质上是用于获取和设置值的函数,但从外部代码来看就像常规属性。 二、Gettersetter 访问器属性由 “getter” 和 “setter” 方法表示。...不以函数的方式 调用 user.fullName,正常 读取 它:getter 在幕后运行。 截至目前,fullName只有一个 getter。...五、兼容性 访问器的一大用途是,它们允许随时通过使用 gettersetter 替换“正常的”数据属性,来控制和调整这些属性的行为。...可能会决定存储 birthday,不是 age,因为它更精确,更方便: 现在应该如何处理仍使用 age属性的旧代码呢?...六、总结 本文基于JavaScript基础,介绍了gettersetter函数使用。对于其中的属性,通过案例的样式,运行效果图的展示,进行详细的讲解。

    1.6K11

    何时使用 Bun 不是 Node.js?

    作者 | Antonello Zanini 翻译、整理 | 编程界 转载自 | 何时使用 Bun 不是 Node.js?...然而,真正的问题是:使用 Bun 不是 Node.js 是否真的有意义呢?...Bun 和 Node.js:优缺点 为了更好地了解何时应该选择 Bun 不是 Node.js,首先需要看一下这两种技术的优缺点。这将帮助您确定在特定情况下哪个是最佳选择。...但由于 Bun 的目标是与 Node.js 完全兼容,这并不是一个大问题。Bun 被设计为 Node.js 的一种可替代方案,从一个转换到另一个是一个相对平稳的过程。...因此,Bun 不仅因为其即时的好处具有吸引力,而且因为其长期的可维护性目标具有吸引力。 总结 在本博客文章中,我们探讨了为什么以及何时 Bun 可以成为 Node.js 的良好替代品。

    33110

    iOS_理解“属性”(property)这一概念

    其中“获取方法”(getter)用于读取变量值,“设置方法”(setter)用于写入变量值。...如:两个库中使用了新旧两份不同的代码,那么运行时就会出现不兼容的现象,其他编程语言都有应对此问题的办法。 ​ OC的做法是,把实例变量当做一种存储偏移量所用的“特殊变量”,交由“类对象”保管。...偏移量会在运行时查找,如果类的定义变了,那么存储的偏移量也就边了,这样的话,无论何时访问实例变量,总能使用正确的偏移量。 ​...如一个线程循环读数据,另一个线程循环写数据,那么就肯定会出现内存问题,因为这和gettersetter没有关系。...(如:NSArray的objectAtIndex:就不是线程安全的,需要加锁等确保安全) nonatomic非原子性访问: ​ 就是去掉了atomic为存取方法添加的锁,即其gettersetter方法不是线程安全的

    60120

    采用现代Objective-C

    确保instancetype工厂方法有权利子类化行为,在初始化的时候一定要使用 [self class]不是直接引用的类名。遵循这个惯例确保编译器将正确判 断出子类的类型。...编译器确定适当的返回类型+factoryMethodA应该是MyObjectSubclass 子类,不是超类的工厂方法被调用。...---- 请注意,您仅应该用instancetype替换id作为返回值,不是在你的代码的任何地方都这么做。不像id,instancetype在 声明方法时仅仅只能作为返回值类型使用。...---- 使用属性不是实例变量在尽可能多的地方提供了许多好处: 自动合成getters和setters。当你声明一个属性,默认情况下为你创建gettersetter方法。...因为访问器方法的命名约定方便,很明显gettersetter方法是做什么的。 property关键字表示关于行为的额外信息。

    58630

    iOS @property探究(一): 基础详解你要知道的@property都在这里

    属性(property)提供了一种安全、便捷的方式来与这些属性(attribute)交互,不需要手动编写一系列的访问方法,如果需要的话可以自定义gettersetter方法来覆盖编译器自动生成的相关方法...尽量多的使用属性(property不是实例变量(attribute)因为属性(property)相比实例变量有很多的好处: 自动合成gettersetter方法。...name], [p age]); } return 0; } 通过调用方式可以看出,settergetter本质就是实例方法,可以通过函数调用的方式来使用。...readonly表示只合成getter不合成setter。...前文介绍copy修饰符的时候讲过,在修饰NSString这样的不可变对象的时候使用copy修饰,但其实当给对象赋一个NSString时仍旧只复制了指针不是拷贝内容,原因同上。

    1.7K90

    为什么不需要为Python对象添加 gettersetter

    Gettersetter在java中被广泛使用。一个好的java编程准则为:将所有属性设置为私有的,同时为属性写gettersetter函数以供外部使用。...这样做的好处是属性的具体实现被隐藏,当未来需要修改时,只需要修改gettersetter即可,不用修改代码中所有引用这个属性的地方。...不可能触发一个函数的调用。...可以使用@property 装饰器将一个直接访问的属性转变为函数触发式属性。...这个函数会检查输入是否为一个字符串,如不是则raise一个TypeError 在获取属性时(代码的最后一行),用于get name的函数被调用 在修改前后,使用Person类的代码完全相同 总结 Python

    1.3K20

    iOS理论基础(二)

    @property 的本质是什么?ivar、gettersetter 是如何生成并添加到这个类中的 @property 的本质是什么?...@protocol 和 category 中如何使用 @property 在 protocol 中使用 property 只会生成 settergetter 方法声明,我们使用属性的目的,是希望遵守我协议的对象能实现该属性...category 使用 @property 也是只会生成 settergetter 方法的声明,如果我们真的需要给 category 增加属性的实现,需要借助于运行时的两个函数: objc_setAssociatedObject...setter= getter=的样式: @property (nonatomic, getter=isOn)BOOLon; ( `setter=`这种不常用,也不推荐使用。...假如一个属性被声明为 @dynamic var,然后你没有提供@setter方法和 @getter 方法,编译的时候没问题,但是当程序运行到instance.var = someVar,由于缺 setter

    42510

    iOS 开发:彻底理解 iOS 内存管理(ARC 篇)

    使用 ARC 后,系统会检测出何时需要保持对象,何时需要自动释放对象,何时需要释放对象,编译器会管理好对象的内存,会在何时的地方插入 retain、release 和 autorelease,通过生成正确的代码去自动释放或者保持对象...copy:与 strong 类似,不同之处在于 copy 在对象进行赋值(调用 setter 方法)时执行的是 copy 操作不是 retain 操作。...@property 参数会帮我们生成对应的 settergetter 方法。不同的修饰符生成的 settergetter 方法也不同。...strong 对应的 setter 方法,是将参数进行了 retain 操作, copy 对应的 setter 方法,是将参数内容进行了 copy 操作。...ARC 下循环引用问题 ARC 和 MRC 一样,如果 A 拥有 B,B 也拥有 A,那么必须一方使用弱指针。

    59310

    Python @propertygetter setter原理详解

    我们可以使用@property装饰器来创建只读属性,@property装饰器会将方法转换为相同名称的只读属性,可以与所定义的属性配合使用,这样可以防止属性被修改。...后,这个方法就变成了一个属性,如果后面加入了 (),那么就是当作函数来调用,它却不是callable(可调用)的。...gettersetter方法: 把一个getter方法变成属性,只需要加上@property就可以了,此时,@property本身又创建了另一个装饰器@score.setter,负责把一个setter..._score = value 我们在对实例属性操作的时候,就知道该属性很可能不是直接暴露的,而是通过gettersetter方法来实现的。...还可以定义只读属性,只定义getter方法,不定义setter方法就是一个只读属性: class Student(object): @property def birth(self):

    1.4K20

    OC-基础总结(二)

    自动生成这个属性的getter setter方法的声明。 3). 自动生成这个属性的getter setter方法的实现。 @property参数 1). @property可以带参数的....生成gettersetter方法名称相关的参数。 默认情况下@property生成的getter setter方法的名字都是最标准的名字。...同时我们可以通过参数来指定@property生成的方法的名字。 getter = getter方法名字 用来指定@property生成的getter方法的名字。...同1组参数只能使用1个,参数的顺序可以随意。 @class与#import的区别 当两个类相互包含的时会出现循环引用的问题,造成无限递归,导致无法编译通过。...: 分类只能增加方法,不能增加属性 在分类之中可以写@property 但是不会自动生成私有属性,也不会自动生成getter setter的实现,只会生成getter setter的声明。

    959100

    vue的双向绑定原理_vue2双向绑定原理

    ,才能被赋值运算符改变,默认为 false get:属性的 getter 函数,如果没有 getter,则为 undefined。...该函数的返回值会被用作属性的值,默认为 undefined set:属性的 setter 函数,如果没有 setter,则为 undefined。当属性值被修改时,会调用此函数。...前面说到Object.defineProperty()方法将这些属性全部转化为getter/setter,而这些 getter/setter 对用户来说是不可见的,但是在内部它们让 Vue 能够追踪依赖...由于 Vue 会在初始化实例时对 property 执行 getter/setter 转化,所以 property 必须在对象上存在才能让 Vue 将它转换为响应式的。...但是,可以使用 Vue.set(object, propertyName, value) 方法向嵌套对象添加响应式 property

    854100
    领券