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

消除JAVA编程中的坏味道

,这个readResolve方法仅利用公有API创建外围类实例,最大程度上消除了序列化机制中语言本身之外的特征....避免创建不必要的对象 重用而不是创建对象 消除过期的对象引用 清空过期引用,如果又被错误的解除引用立即会抛出异常,但应该只是一种意外而不是规范 常见内存泄漏: 只要自己管理内存,就应该警惕内存泄漏问题...为了继承而设计类会有一些实质性的限制,需要消除自用特性:case将每个可覆盖方法的代码移到一个私有的辅助方法中....如果标记程序元素而非类或者接口,考虑未来可能给标记添加更多信息,或者标记要适合于已经广泛使用了注解元素的框架,那么标记注解就是正确的选择 方法 检查参数的有效性 应该在发生错误之后尽快检测出错误 ex:...反面例子:企图使用JAVA的错误判断机制来提高性能,这样反而阻止了JVM本来可能的优化,尤其是现代的JVM上 异常应该只用于异常的情况下,他们永远不应该用于正常的控制流 正面:提供状态测试方法或者返回一个可以识别的值如

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

    如何在Java中避免equals方法的隐藏陷阱(一)

    常见的等价方法陷阱 java.lang.Object 类定义了equals这个方法,它的子类可以通过重载来覆盖它。不幸的是,在面向对象中写出正确的equals方法是非常困难的。...事实上,在研究了大量的Java代码后,2007 paper的作者得出了如下的一个结论: 几乎所有的equals方法的实现都是错误的! 这个问题是因为等价是和很多其他的事物相关联。...例如其中之一,一个的类型C的错误等价方法可能意味着你无法将这个类型C的对象可信赖的放入到容器中。...但是,只要这个equals方法是错误的实现,那么你就有可能会看见如下的一些行为: Set hashSet = new java.util.HashSet(); hashSet.add(elem1...而是一种变化了的重载。在Java中重载被解析为静态的参数类型而非运行期的类型,因此当静态参数类型是Point,Point的equals方法就被调用。

    1.8K80

    如何在Java中避免equals方法的隐藏陷阱(二)

    x和y域不再是final,并且两个set方法被增加到类中来,并允许客户改变x和y的值。...equals和hashCode这个方法的定义现在是基于在这两个会发生变化的域上,因此当他们的域的值改变时,结果也就跟着改变。因此一旦你将这个point对象放入到集合中你将会看到非常神奇的效果。...当然,所有的这一切都是在x域的修改后才发生的,p最终的的hashCode是在集合coll错误的哈希桶中。即,原始哈希桶不再有其新值对应的哈希码。...陷阱4:不满足等价关系的equals错误定义 Object中的equals的规范阐述了equals方法必须实现在非null对象上的等价关系: 自反原则:对于任何非null值X,表达式x.equals(x...equals的新定义比老定义中检查了更多的情况:如果对象是一个Point对象而不是ColoredPoint,方法就转变为Point类的equals方法调用。

    1.7K80

    使用 Java8 中的 Optional 类来消除代码中的 null 检查

    —— 每个 Java 程序员都非常了解的异常。 本篇文章将详细介绍 Optional 类,以及如何用它消除代码中的 null 检查。...基于上面的原因,Java8 中引入了一个新的类 Optional,用以避免使用 null 值引发的种种问题。...提取Optional对象中的值 如果我们要获取 User 对象中的 roleId 属性值,常见的方式是直接获取: String roleId = null; if (user !...如果 filter() 方法中的 Lambda 表达式成立,filter() 方法会返回当前 Optional 对象值;否则,返回一个值为空的 Optional 对象。...更多关于函数式编程请移步至 #公众号:一个正经的程序员 文章:一篇文章教会你使用 Java8 中的 Lambda 表达式 这里有几条关于 Optional 使用的建议: 尽量避免在程序中直接调用 Optional

    41730

    Java中的构造方法

    当同一个类存在多个构造方法时,java编译系统会自动按照初始化时最后面括号的参数个数以及参数类型来自动一一对应 完成构造函数的调用] 7,构造方法可以被重载...构造代码块是给所有不同对象的共性进行统一初始化,构造函数是给对应的对象进行初始化 9,自定义类中,如果不写构造方法,java系统会默认添加一个无参的构造方法。...在Subtine的主方法中只调用子类构造方法,实例化子类对象并且在子类构造方法中,没有调用父类的构造方法的任何语句。...但是在实例化对象时,它相应的调用了父类构造方法,在结果中还可以看到调用构造方法的顺序,首先是顶级,再继续往下直达本身类。...还补充一点,关于构造方法的可扩展性; 查看过源码的应该都发现过jdk的编码人员会在一个类中建立多个构造方法;然而他的作用就是提高可扩展性; 这么多构造方法,他们之间并且还有联系;通过this

    77830

    java中的Native方法

    这个特征并非java所特有,很多其它的编程语言都有这一机制,比如在C++中,你可以用extern "C"告知C++编译器去调用一个C的函数。...当一个native method接收到一些非基本类型时如Object或一个整型数组时,这个方法可以访问这非些基本型的内部,但是这将使这个native方法依赖于你所访问的java类的实现。...有一点要牢牢记住:我们可以在一个native method的本地实现中访问所有的java特性,但是这要依赖于你所访问的java特性的实现,而且这样做远远不如在java语言中使用那些特性方便和容易。...本地方法非常有用,因为它有效地扩充了jvm.事实上,我们所写的java代码已经用到了本地方法,在sun的java的并发(多线程)的机制实现中,许多与操作系统的接触点都用到了本地方法,这使得java程序能够超越...与java环境外交互: 有时java应用需要与java外面的环境交互。这是本地方法存在的主要原因,你可以想想java需要与一些底层系统如操作系统或某些硬件交换信息时的情况。

    4.8K10

    深入解析Java中的数组复制:System.arraycopy、Arrays.copyOf和Arrays.copyOfRange

    当涉及到在Java中处理数组时,有许多方法可供选择,其中一些包括System.arraycopy()、Arrays.copyOf()和Arrays.copyOfRange()。...这些方法允许您在不同的数组之间复制数据,但它们之间有一些细微的差异。在本篇博客文章中,我们将深入探讨这些方法,以便您了解何时使用它们以及如何正确使用它们。...System.arraycopy()System.arraycopy方法是Java中的本地方法,其实际实现是由Java虚拟机的底层实现提供的。...如果源数组包含基本数据类型(如int、char等),新数组将包含这些基本数据类型的默认值,如0或'\0'。总结在处理数组时,选择合适的复制方法取决于您的具体需求。...如果您想要创建一个新数组,其长度与源数组相同,并且将源数组的内容全部复制到新数组中,那么Arrays.copyOf是一个方便的选择。

    33871

    用 VIF 方法消除多维数据中的多重共线性

    多元线性回归是我们在数据分析中经常用到的一个方法,很多人在遇到多维数据时基本上无脑使用该方法,而在用多元线性回归之后所得到的结果又并不总是完美的,其问题实际上并不出在方法上,而是出在数据上。...今天我们就讲解一下如何用VIF方法消除多维数据中多重共线性的问题。 首先介绍一下多重共线性。...,而这种情况我们往往很难察觉,很多人看到自己的模型在数学角度上没有任何问题,就直接拿去用了,结果总是得到错误的结论。...在了解了VIF的概念之后,我们就用代码来展示一下如何诊断并消除多重共线性。这里笔者依然使用前面的数据,但加入了VIF检测,同时给出消除多重共线性后的结果,全部代码如下。...,这列数据在VIF方法中只参与计算,但其值不用于比较大小。

    1.6K30

    Java中ArrayList的同步方法

    arrayList 的实现是默认不同步的。这意味着如果一个线程在结构上修改它并且多个线程同时访问它,它必须在外部同步。结构修改意味着从列表中添加或删除元素或显式调整后备数组的大小。...改变现有元素的值不是结构修改。 有两种方法可以创建同步Arraylist。 1. Collections.synchronizedList() 方法。 2....以下是 Java 中 ArrayList 和 CopyOnWriteArrayList 类之间的显着差异。 数组列表 复制写入数组列表 同步 ArrayList 不同步。...CopyOnWriteArrayList 是故障安全的,它在迭代过程中永远不会抛出 ConcurrentModificationException。...其背后的原因是 CopyOnWriteArrayList 每次修改时都会创建一个新的数组列表。 删除操作 ArrayList 迭代器支持在迭代过程中移除元素。

    1.9K10

    如何理解java中的方法

    1:方法(掌握) (1)方法:就是完成特定功能的代码块。 注意:在很多语言里面有函数的定义,而在Java中,函数被称为方法。...:就是功能结果的数据类型 方法名:就是起了一个名字,方便我们调用该方法。...参数类型:就是参数的数据类型 参数名:就是变量 参数分类: 实参:实际参与运算的数据 形参:方法上定义的,用于接收实际参数的变量 方法体语句:就是完成功能的代码块 return:...结束方法 返回值:就是功能的结果,由return带给调用者。...return,reture:结束方法) B:参数列表 你要传递几个参数,以及每个参数的数据类型 比如说: /* 键盘录入两个数据,返回两个数中的较大值 *

    75810

    Java中的SimpleDateFormat方法分析

    Java中的SimpleDateFormat方法分析 先进行专栏介绍 本专栏是自己学Java的旅途,纯手敲的代码,自己跟着黑马课程学习的,并加入一些自己的理解,对代码和笔记 进行适当修改。...SimpleDateFormat方法 在Java中,SimpleDateFormat类是用于日期格式化和解析的类。它位于java.text包中。...分析 SimpleDateFormat SimpleDateFormat是一个用于区域设置敏感的方式格式化和解析日期的具体类 日期和时间格式由日期和时间模式字符串指定,在日期和时间模式字符串中, 从...’A’到’Z’以及从‘a’到’z’引号中的字母被解释为表示日期或时间字符串的组成部分的模式字母 常用模式字母 y 年 M 月 d 日 H 时 m 分 s 秒 举例 2021年10月27日11:11:...设置方法: void setLenient(boolean lenient):设置解析时是否宽松的解析日期,默认为true,即宽松解析,对于一些不合法的日期也会尝试解析。

    21130

    Java中的compareTo方法详解

    在Java编程中,有时候我们需要对对象进行比较和排序。为了实现这一目标,Java提供了一个非常有用的接口叫做Comparable,以及一个重要的方法compareTo。...本文将详细解释什么是Comparable接口,以及如何使用compareTo方法来比较对象。什么是Comparable接口?Comparable是Java中的一个接口,位于java.lang包中。...接口,并在compareTo方法中定义了排序的比较规则。...总结总之,Comparable接口和compareTo方法是Java中强大的工具,用于定义对象之间的比较规则和自然排序顺序。...通过正确实现它们,您可以轻松地在Java应用程序中对对象进行比较和排序,从而提高代码的灵活性和可维护性。希望本文对您理解这两个概念有所帮助!

    43950
    领券