首页 > 编程语言 >Java核心技术卷1 第四章选读

Java核心技术卷1 第四章选读

时间:2024-12-18 18:53:27浏览次数:5  
标签:选读 Java int private 对象 方法 public 第四章

前言

本文内容选自Java核心技术卷1 第10版,感兴趣的小伙伴可以自行阅读原书,以下内容为本人学习后摘取的片段与大家分享。

正文

4.10 类设计技巧

我们不会面面俱到,也不希望过于沉闷,所以这一章结束之前,简单地介绍几点技巧。应用这些技巧可以使得设计出来的类更具有 OOP 的专业水准。

  1. 一定要保证数据私有
    这是最重要的;绝对不要破坏封装性。有时候,需要编写一个访问器方法或更改器方法,但是最好还是保持实例域的私有性。很多惨痛的经验告诉我们, 数据的表示形式很可能会改变, 但它们的使用方式却不会经常发生变化。当数据保持私有时,它们的表示形式的变化不会对类的使用者产生影响,即使出现 bug 也易于检测。

为什么一定要保证数据私有呢?
举个栗子,一个涉及到加密算法的类,其中具有公钥私钥属性。我们可以通过公钥私钥再经过加密算法生成结果,这个结果是不会被破解的,所以我们可以允许其他类拿到这个结果,但是公钥和私钥不允许暴露,所以也就不能设置为public。如果被拿到了,那我们提供的这个结果就没有任何意义,因为其他人同样可以根据算法生成一致的结果。

  1. 一定要对数据初始化
    Java 不对局部变量进行初始化, 但是会对对象的实例域进行初始化。最好不要依赖于系统的默认值,而是应该显式地初始化所有的数据,具体的初始化方式可以是提供默认值,也可以是在所有构造器中设置默认值。
  1. 不要在类中使用过多的基本类型
    就是说,用其他的类代替多个相关的基本类型的使用。这样会使类更加易于理解且易于修改。例如,用一个称为 Address 的新的类替换一个 Customer 类中以下的实例域:
private String street;
private String city;
private String state;
private int zip;

这样,可以很容易处理地址的变化,例如, 需要增加对国际地址的处理。

  1. 不是所有的域都需要独立的域访问器和域更改器
    或许, 需要获得或设置雇员的薪金。而一旦构造了雇员对象,就应该禁止更改雇用日期,并且在对象中,常常包含一些不希望别人获得或设置的实例域,例如,在 Address 类中,存放州缩写的数组。
  1. 将职责过多的类进行分解
    这样说似乎有点含糊不清, 究竟多少算是“ 过多” ? 每个人的看法不同。但是,如果明显地可以将一个复杂的类分解成两个更为简单的类,就应该将其分解(但另一方面,也不要走极端。设计 10 个类,每个类只有一个方法,显然有些矫枉过正了)。

下面是一个反面的设计示例。

public class CardDeck // bad design
{
  private int[] value;
  private int[] suit;
  
  public CardDeck() { . . . }
  public void shuffle() { . . . }
  public int getTopValue() { . . . }
  public int getTopSuit() { . . . }
  public void draw() { . . . }
}

实际上,这个类实现了两个独立的概念:一副牌(含有 shuffle 方法和 draw方法)和一
张牌(含有查看面值和花色的方法)。另外, 引入一个表示单张牌的 Card 类。现在有两个类,
每个类完成自己的职责:

public class CardDeck
{
  private Card[] cards;
  public CardDeck() { . . . }
  public void shuffle() { . . . }
  public Card getTop() { . . . }
  public void draw() { . . . }
}
public class Card
{
  private int value;
  private int suit;
  public Card(int aValue, int aSuit) { . . . }
  public int getValue() { . . . }
  public int getSuit() { . . . }
}
  1. 类名和方法名要能够体现它们的职责
    与变量应该有一个能够反映其含义的名字一样,类也应该如此(在标准类库中,也存在着一些含义不明确的例子,如:Date 类实际上是一个用于描述时间的类)。
    命名类名的良好习惯是采用一个名词(Order )、前面有形容词修饰的名词( RushOrder )或动名词(有“ -ing” 后缀)修饰名词(例如, BillingAddress)。对于方法来说,习惯是访问器方法用小写 get 开头 ( getSalary ), 更改器方法用小写的 set 开头(setSalary )

指路https://www.cnblogs.com/liqiangchn/p/12000361.html
你或许可以从这篇文章学习到绝大部分的命名规则。

  1. 优先使用不可变的类
    LocalDate 类以及 java.time 包中的其他类是不可变的—没有方法能修改对象的状态。类似 plusDays 的方法并不是更改对象,而是返回状态已修改的新对象。
    更改对象的问题在于, 如果多个线程试图同时更新一个对象,就会发生并发更改。其结果是不可预料的。如果类是不可变的,就可以安全地在多个线程间共享其对象。
    因此,要尽可能让类是不可变的,这是一个很好的想法。对于表示值的类,如一个字符串或一个时间点,这尤其容易。计算会生成新值, 而不是更新原来的值。
    当然,并不是所有类都应当是不可变的。如果员工加薪时让 raiseSalary 方法返回一个新的 Employee 对象,这会很奇怪。

指路https://cloud.tencent.com/developer/article/1477314
这篇博文会帮助你如何使用不可变类

本章介绍了 Java 这种面向对象语言的有关对象和类的基础知识。 为了真正做到面向对象,程序设计语言还必须支持继承和多态。Java 提供了对这些特性的支持,具体内容将在下一章中介绍。

标签:选读,Java,int,private,对象,方法,public,第四章
From: https://www.cnblogs.com/jwcat313/p/18615655

相关文章

  • Java基于springboot+vue的摄影设备租赁管理系统
    收藏关注不迷路!!......
  • JavaWeb核心技术阶段的详细学习路线
    一、HTML/CSS/JS基础(1-2周)HTML(超文本标记语言)学习HTML文档结构,包括DOCTYPE声明、html标签、head标签和body标签的作用。掌握常见的HTML标签,如标题标签(h1-h6)、段落标签(p)、链接标签(a)、图像标签(img)、列表标签(ul、ol、li)等。学习表格标签(table、tr、td)用于数据展示,表单标签......
  • Java大厂提升技能阶段学习路线的详细规划
    一、微服务架构开发思想与实现Docker学习Docker的基本概念,包括镜像、容器、仓库等。掌握Docker的安装与配置,在本地环境和服务器环境中进行部署。学会使用Dockerfile构建自定义镜像,以及使用docker-compose编排多容器应用。了解Docker网络模型,实现容器间的通信与......
  • 膜拜!阿里自爆十万字Java面试手抄本,脉脉一周狂转50w/次
    2025年的金三银四很快就到了,铁子们做好跳槽拿高薪的准备了吗?为了帮助大家能够找到一份满意的工作,我找到了在阿里任职的同学,他把内网上十万字Java面试手抄本直接开源分享了出来;十万字Java面试手抄本这份Java面试手抄本包含了——Java基础、并发编程、JVM、Dubbo、MyBatis、Ka......
  • JavaSE基础学习路线
    Java入门、IntellijIDEA、AI辅助工具Java入门:主要涵盖Java语言的基本概念,比如它是一种面向对象的编程语言,跨平台性强(通过Java虚拟机实现“一次编写,到处运行”的特性),了解如何安装Java开发环境(JDK)等基础内容,是踏入Java编程世界的第一步。IntellijIDEA:一款功能强大且非常流行的J......
  • JavaSE进阶学习路线
    Java集合框架概述:Java集合框架提供了一套用于存储、操作和管理对象组的接口和类。它位于java.util包下,能方便地实现对数据的各种处理需求,比如增删改查等操作。主要接口与实现类:List:有序、可重复的集合,常见实现类有ArrayList(基于数组实现,随机访问快)、LinkedList(基于链表......
  • 《刚刚问世》系列初窥篇-Java+Playwright自动化测试-7-元素基础定位方式-下篇 (详细教
    1.简介上一篇主要是讲解我们日常工作中在使用Playwright进行元素定位的一些比较常用的基础定位方式的理论基础知识以及在什么情况下推荐使用。今天这一篇讲解和分享一下剩下部分的基础定位方式。2.过滤器定位例如以下DOM结构,我们要在其中单击第二个产品卡的购买按钮。我们有几......
  • Java程序员如何高效学习Spring Cloud Alibaba?
    SpringCloudAlibaba有多香?大家都知道SpringCloudAlibaba是阿里巴巴提供的微服务开发一站式解决方案,是阿里巴巴开源中间件与SpringCloud体系的融合。依托SpringCloudAlibaba,您只需要添加一些注解和少量配置,就可以将SpringCloud应用接入阿里微服务解决方案,通过阿......
  • java 归并排序,原理、算法分析、实现细节、优缺点以及一些实际应用场景
    更多资源推荐:http://sj.ysok.net/jydoraemon提取码:JYAM实用优质资源/教程公众号【纪元A梦】###归并排序的详细解析探讨归并排序,包括其工作原理、算法分析、实现细节、优缺点以及一些实际应用场景。####1.基本概念归并排序是一种基于分治法的高效排序算法。它的基本思想是将......
  • JavaScript中var、let和const的区别是什么?
    1.变量声明关键字概述1.1var关键字的特点var是JavaScript中传统的变量声明关键字,它具有以下特点:函数作用域:使用var声明的变量在函数内部是局部的,仅在该函数内部可见。全局作用域:在函数外部声明的var变量是全局的,在整个程序中都可访问。变量提升:var声明的变......