首页
学习
活动
专区
圈层
工具
发布

Java复习2-对象与类

一个class的属性应该只能自己修改,其他class都只是与本class沟通,而不应该有能力修改。比较常见的一个问题是Date属性。...按照封装的要求,这样的做法是不合适的。因为其他class可以获取Date对象,Date对象是可变的。那么,就有可能会产生日期被修改的可能。...如果项目有引入Findbugs的扫描,这个class肯定会被扫描出来的,不应该返回一个可变对象。那么,怎么做才可以避免这个问题?我们确实需要暴露Date啊。 答案是暴露一个不可变的对象。...LocalDate就像String一样,没有提供任何可以改变内部属性的方法,所有的修改之类的方法都将会创建一个新的对象。这样,修改操作将不会影响原来的class。...这也上开头讲述的封装不应返回一个可变变量的原因。任何拿到这个可变变量地址的方法都可以直接修改变量里的属性。那方法2有什么不同? ?

86540

iOS字典转模、xib的使用、自定义视图

) 1、只读指针属性的分析(指向关系不可变,指向对象的内容可变) 不可变属性的值,若存储的是指针,则该属性对应的对象成员是可变的 只读指针属性的地址值不可变,意味的指针和指向的对象间的关系不可变,但被指向的对象内容是可变的...,让编译器主动推动对象的实际类型,以避免使用ID,造成开发中不必要的麻烦 1.instancetype 只能使用于返回值类型,不能像id一样用于参数类型;但instancetype比id多的一个好处是:...属性不能使用New 开头进行命名 1.6 @synthesize的用法 ---- @synthesize 中可以定义 与变量名不相同的getter和setter的命名,籍此来保护变量不会被不恰当的访问...和setter的命名,籍此来保护变量不会被不恰当的访问 /** 懒加载模型的图片对象属性 */ - (UIImage *)image{ if (nil == _image) {//...2)使用模型修改数据、读取数据均采用对象的属性,提高编写效率 2.1 字典转模型的实现步骤 1)字典转模型的过程,通常被封装在模型内部 2)模型应该提供一个“带有NSDictionary类型”参数的构造方法

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

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

    =XXX:指定“获取方法”的方法名 setter=XXX:指定“设置方法”的方法名 四、灵魂拷问 一、属性概念 ​ “属性”(property)是Objective-C的一项特性,用于封装对象中的数据。...NSString*时,经常使用此特性来保护其封装性,因为传递给setter方法的新值,有时候可能是一个指向NSMutableString类的实例,若此时不拷贝字符串,那么设置完属性后,字符串的值就可能会在对象不知情的情况下遭人更改...Runtime维护了一个全局的hash(哈希)表:key为对象内存地址,value为可变数组可以存放n个weak对象的指针地址。...__unsafe_unretained:该引用不对对象保持强引用,并在对象被释放后不会置为nil, 从而成为一个野指针,所以是unsafe的 __autorelease:用于表示通过引用(id *)传递并在返回时自动释放的参数...因为xib或storyboard对该控件已经有一个强引用了,而拖出来的属性应该跟这个控件保持相同的生命周期,所以应该用weak修饰。 ​

    98920

    学 Guava 发现:不可变特性与防御性编程

    一、面试常谈:String 类与不可变特性 问:String 类是可变的吗? 答:emm……由于String类的底层是 final 关键字修饰,因此它是不可变的。...除了构造新 Date 对象,还有深克隆的方式,但是此处不推荐使用克隆。至于为什么?由于篇幅有限,大家可自行百度! 那么,这样就实现了 Period 类不可变了吗? 并没有!...2、Arrays.asList 返回仅可查看的“视图” Arrays.asList() 返回一个ArrayList内部类,没有add()、remove()、无法改变长度等,这样设计的初衷是什么?...为什么不直接返回可变长的 ArrayList(new ArrayList())? 和我们刚刚的重写 getter 方法类似,用于保证对象安全不可改变特性!...举个例子,就是你有一个数组,怎么设计一个方法:保证既可以遍历,又不能修改呢? 返回一个继承了List接口的轻量级“视图”不失为一个好的设计方式。而直接返回数组则是不安全的选择。

    66840

    Getter & Setter:使用还是废弃

    考虑下面的例子 我们通常都认为以上是糟糕的代码风格,因为它破坏了封装性。替代方法是: 有人认为这样封装了属性。这真的实现了封装吗? 实际上,Getter/Setter和封装性没有任何关系。...以这种方式使用的Getter和Setter通常破坏了封装性。 一个真正完整封装的类是没有setter方法的,而且最好也没有getter方法。...类应该负责使用自身的数据计算并返回结果,而不是从某个类获得数据并计算这些数据。...增加一个不必要的getter会暴露内部结构,这也增加了代码耦合的机会。避免方案是在每次增加存取方法的时候,我们应该分析是否可以通过封装行为来替代存取方法。...但是,为每一个属性都创建getter和setter方法确实有些极端。而且这也要根据具体的情况来定,有些时候你仅仅希望有一个单纯的数据对象而已。应该为真正需要的属性添加存取方法。

    1.6K60

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

    setter方法是有一个参数的无返回值方法,getter方法是没有参数的且有一个返回值的方法,返回值类型与属性声明的类型一致。...即getter方法,它不接受任何参数,并且返回一个值。如果将这个方法转换成一个属性,就可以用readonly关键字标记它。...getter方法应当是幂等(idempotent)的(如果一个getter方法被调用两次,那么第二次调用时返回的结果应该和第一调用时返回的结果相同)。...,因为Foundation框架提供的这些类都实现了NSCopying协议,使用copy方法返回的都是不可变对象,如果使用copy修饰符在对可变对象赋值时则会获取一个不可变对象,接下来如果对这个对象进行可变对象的操作则会产生异常...的返回值为可变对象。

    2K90

    iOS理论基础(二)

    “属性” (property)作为 Objective-C 的一项特性,主要的作用就在于封装对象中的数据。 ivar、getter、setter 是如何生成并添加到这个类中的?...为这种属性设置新值时,设置方法既不保留新值,也不释放旧值。此特质同 assign 类似, 然而在属性所指的对象遭到摧毁时,属性值也会清空(nil out)。...若是自己定义存取方法,那么就应该遵从与属性特质相符的原子性。...a.因为父类指针可以指向子类对象,使用 copy 的目的是为了让本对象的属性不受外界影响,使用 copy 无论给我传入是一个可变对象还是不可对象,我本身持有的就是一个不可变的副本....b.如果我们使用是 strong ,那么这个属性就有可能指向一个可变对象,如果这个可变对象在外部被修改了,那么会影响该属性. aa.在非集合类对象中:对 immutable 对象进行 copy 操作,是指针复制

    72310

    小米 二面

    你好,我是田哥 上周,一位朋友去小米的面经,很多都是开放性问题,真的八股文好像也不顶用了。 1、Java 编程语言它有什么样的特点吗?...面向对象: Java 是一种支持面向对象编程范式的语言,提供类、对象、继承、封装、多态等面向对象特性。...异常信息封装: 创建一个统一的异常信息结构,包括异常类型、错误代码、错误消息等,并封装异常信息以便返回给前端。 返回异常信息给前端: 在发生异常时,通过适当的方式将异常信息返回给前端。...类型的异常,封装异常信息到 ErrorResponse 对象,并返回给前端。...无参构造函数: 提供一个无参构造函数,以便 JSON 转换库能够实例化对象。 属性的访问修饰符: 使用私有字段并通过公共的 getter 和 setter 方法来访问属性,符合封装的概念。

    39210

    Kotlin实战【二】Kotlin基本要素

    作为一个静态类型语言,Kotlin不是要求每个表达式都应该在编译期具有类型吗?事实上,每个变量和表达式都有返回类型。...***使用不可变引用、不可变对象及无无副作用的函数让你的代码更接近函数式编程风格***。 定义了val变量的代码块执行期间,val变量只能进行唯一一次初始化。...如果你想在变量里面存储一个不匹配的类型的值,你必须转换或者协变这个值到正确的类型。...name: String, //只读属性:自动生成一个域和简单的getter var isMarried: Boolean //可写属性:一个域,getter和setter ) 接下来我们看下如何使用上面定义好的...>**小贴士:** > - 你可以在Java定义的类中使用Kotlin的属性语法。在Java类中的getter可以在Kotlin中val属性获取,getter/setter可以通过var属性获取。

    1.5K20

    面经之《招聘一个靠谱的iOS》import CYLBlockExecutor.himport CYLBlockExecutor.himport CYLNSObject+RunAtDeallo

    当属性类型为 NSString 时,经常用此特质来保护其封装性,因为传递给设置方法的新值有可能指向一个 NSMutableString 类的实例。...所以,这时就要拷贝一份“不可变” (immutable)的字符串,确保对象中的字符串值不会无意间变动。只要实现属性所用的对象是“可变的” (mutable),就应该在设置新属性值时拷贝一份。...因为父类指针可以指向子类对象,使用 copy 的目的是为了让本对象的属性不受外界影响,使用 copy 无论给我传入是一个可变对象还是不可对象,我本身持有的就是一个不可变的副本....如果我们使用是 strong ,那么这个属性就有可能指向一个可变对象,如果这个可变对象在外部被修改了,那么会影响该属性. copy 此特质所表达的所属关系与 strong 类似。...所以,这时就要拷贝一份“不可变” (immutable)的字符串,确保对象中的字符串值不会无意间变动。只要实现属性所用的对象是“可变的” (mutable),就应该在设置新属性值时拷贝一份。

    1.3K100

    一文讲透 Java 中 POJO, JavaBeans, DTO 和 VO 的区别

    private,并使用 getter/setter 方法访问属性。...VO 应该始终覆盖 equals() 和 hashCode() 方法。VO 通常封装小型对象,例如数字、日期、字符串等等。它们遵循值语义,即它们直接更改对象的值并传递副本而不是引用。...将值对象设置为不可变是一个好习惯。值的更改只能通过创建一个新对象而不是更新旧对象本身来发生。这有助于理解两个创建相等的值对象的隐式契约应该保持相等。...DTO 通常包含一些与领域模型无关的属性,用于传递数据而不是表示实体。 VO(Value Object,值对象):VO 是一种用于表示领域模型中的值的对象,它通常是不可变的,一旦创建就不会改变。...VO 一般包含一些属性,用于表示某个特定的值,例如货币、日期、地址等等。VO 可以用于在应用程序的不同层之间传递值,但一般不包含与业务逻辑相关的方法。

    2.3K21

    DDD话语评价之二:“值对象”是DDD的创新吗(全文)

    . , 2020 ****** Seriously Good Software的中译本起名《你真的会写代码吗》,已于2021年7月出版。此处非广告。我未和出版社联系过,也不欣赏中译本乱改名的行为。...8.2.8.4 本书关于“值对象”的观点 对象本就应该是可变的 “面向对象”就是把某些数据和经常操纵这些数据的行为封装在一起变成类,以此作为系统的基本构造块,如图8-72。...像下面这些经常看到的有规律一一对应的“面向对象”封装: *每个属性刚好对应一对getter/setter操作(现在的Property语法就更省事了),然后就说封装了,面向对象了。...应该用哪些属性值来计算,怎么计算,会修改哪些属性值,怎么修改,这些行为规则封装在类中,可以通过状态机描述。状态表征了对象表现出相同行为规则的属性值组合,把行为和数据连接起来。...如果没有做到这样的封装,或者认为没有必要做到这样的封装,那面向对象的意义就不大了。如果一味强求属性值或状态“不可变”,那完全可以采用另外一种思考范式嘛。

    66520

    面向对象的思想,谈面试的过程?

    4 个重要概念: 成员变量(有时叫做域,有时叫做字段,有时叫做属性)name; 成员变量访问器(有时叫做 getter/setter)getName() 和 setName(); 构造方法(有时叫做构造器...公有方法是类的调用者和维护者最关心的方法,应该在比较靠前的位置展示;保护方法虽然只有子类关心,也可能是“模板设计模式”下的核心方法,所以也要靠前;私有方法只对本类可见,一般不需要特别关心,所以往后放;getter...在初学 Java 编程的时候,我经常产生一个疑惑:为什么不使用 public 修饰成员变量呢?这样做不是比 getter/setter 更方便吗? 我最先想到的答案是这样的: ?...然后再把这个引用通过 = 操作符赋值给左侧的对象变量 qiuqiu,赋值后,qiuqiu就不再是对象变量了,应该称为对象引用。 ? 看完老王的解释,你会不会情不自禁地“哦,原来如此啊!”...当 getter 需要返回一个可变对象的引用时,应该先进行克隆(clone)。以下展示了一个非常简单的克隆方案。

    62020

    哪些代码设计看似是面向对象,实际是面向过程的?

    实际上,这样的做法我是非常不推荐的。它违反了面向对象编程的封装特性,相当于将面向对象编程风格退化成了面向过程编程风格。我通过下面这个例子来给你解释一下这句话。...而面向对象封装的定义是:通过访问权限控制,隐藏内部数据,外部仅能通过类提供的有限的接口访问、修改内部数据。所以,暴露不应该暴露的 setter 方法,明显违反了面向对象的封装特性。...但是,对于 items 属性就不一样了,这是因为 items 属性的 getter 方法,返回的是一个 List集合容器。...正确的做法应该是,在 ShoppingCart 类中定义一个 clear() 方法,将清空购物车的业务逻辑封装在里面,透明地给调用者使用。...我们可以通过 Java 提供的Collections.unmodifiableList() 方法,让 getter 方法返回一个不可被修改的UnmodifiableList 集合容器,而这个容器类重写了

    1K61

    OOP三大特性之封装

    但这一切的前提:每个对象要构建好,即封装要做好。就像每个细胞都有细胞壁将其与外界隔离,形成一个完整个体。 Kay强调对象之间只能通过消息通信。...即便我们把对象理解成数据+函数,数据、函数也不是对等的: 函数是接口 接口是稳定的 数据是内部的实现 实现是易变的,应该隐藏 很多人的开发习惯:写一个类,写其一堆字段,然后生成一堆getter、setter...关于setter: 大概率是你用错名字,应该用一个表达意图的名字 setter通常意味着修改,这是不推荐的 可变的对象会带来很多的问题,后续再深入讨论。所以,设计中更好的做法是设计不变类。...设计角度,必须谨慎自省:这个方法有必要暴露吗? 其实可仅暴露一个方法: 外部的调用代码也会简化: 尽可能减少接口暴露,该原则适于类的设计、系统设计。...其实如果用另一个名字“最小知识原则”可能更容易理解一些,这个也算是程序员的“黑话”吧。 虽然接触OOP已经很久了,不过写程序时,大多数人还是习惯“一个对象一张表”,也没有太多考虑封装。

    61420

    Objective-c 知识总结 -- @property

    _age); } @end 那个警告明显是说,我自动合成的实例变量是__age,而不是 _age,所以你应该定义一个 __age 的实例变量才对,不然我就警告你; 其实这里是间接地证明了,如果你自己定义了相应的带下划线的实例变量...- (NSObject *)obj{ return _obj ; } copy 拷贝对象(相当于创建了新的实例对象),是不可变副本; copy 只能用于遵守了 NSCopying..., copy ) NSMutableArray *mArray; 这种声明真的是自己挖坑了;你要的是可变对象,但是一 copy 就是不可变对象了,运行时会出问题的; 4..../** * 移除实例对象的所有关联值 * * @param object 实例对象 * * @note 这个方法的核心目的是为了方便让实例对象的所有关联值还原到初始状态;你不应该使用此方法来对一个关联值的进行还原...不过这么做编译器会报错,但是只要新建一个该类的类别,在类别.h文件中写上原始类该方法的声明,类别.m文件中什么也不写,就可以正常调用私有方法了。这就是传说中的私有方法前向引用。

    1.8K31

    Effective Java(第三版)——条目十六:在公共类中使用访问方法而不是公共属性

    class Point { public double x; public double y; } 由于这些类的数据属性可以直接被访问,因此这些类不提供封装的好处(条目 15)。...坚持面向对象的程序员觉得这样的类是厌恶的,应该被具有私有属性和公共访问方法的类(getter)所取代,而对于可变类来说,它们应该被替换为setter设值方法: // Encapsulation of data...如条目 67所述,暴露Dimension的内部结构的决定是一个严重的性能问题,这个问题在今天仍然存在。 虽然公共类直接暴露属性并不是一个好主意,但是如果属性是不可变的,那么危害就不那么大了。...this.hour = hour; this.minute = minute; } ... // Remainder omitted } 总之,公共类不应该暴露可变属性...公共累暴露不可变属性的危害虽然仍然存在问题,但其危害较小。 然而,有时需要包级私有或私有内部类来暴露属性,无论此类是否是可变的。

    1.2K10
    领券