自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(110)
  • 收藏
  • 关注

原创 java 汉字数字转阿拉伯数字

java 汉字数字转阿拉伯数字

2024-01-17 09:32:51 407 1

原创 跟我学(Effective Java 2)第78条:考虑用序列化代理代替序列化实例

第78条:考虑用序列化代理代替序列化实例正如第74条中提到以及本章中所讨论的,决定实现Serializable,会增加出错和出现安全问题的可能性,因为它导致实例要利用语言之外的机制来创建,而不是用普通的构造器。然而,有一种方法可以极大地减少这些风险。这种方法就是序列化代理模式(serialization proxy pattern)。序列化代理模式相当简单。首先,为可序列化的类设计一个私有的静...

2019-06-21 18:22:50 208

原创 跟我学(Effective Java 2)第77条:对于实例控制,枚举类型优先于readResolve

第77条:对于实例控制,枚举类型优先于readResolve在第3条中提到的,如果这个类的声明中加上了"implements Serializable"的字样,它就不再是一个Singleton。无论该类使用了默认的序列化形式,还是自定义的序列化形式(见第75条),都没有关系;也跟它是否提供了显式的readObject方法(见第76条)无关。任何一个readObject方法,不管是显式的还是默认...

2019-06-21 18:12:53 280

原创 跟我学(Effective Java 2)第76条:保护性地编写readObject方法

第76条:保护性地编写readObject方法当一个对象被反序列化的时候,对于客户端不应该拥有的对象引用,如果哪个域包含了这样的对象引用,就必须要做保护性拷贝,这是非常重要的。因此,对于每个可序列化的不可变类,如果它包含了私有的可变组件,那么在它的readObject方法中,必须要对这些组件进行保护性拷贝。有一个简单的"石蕊"测试,可以用来确定默认的readObject方法是否可以接受。测试...

2019-06-21 18:08:39 260

原创 跟我学(Effective Java 2)第75条:考虑使用自定义的序列化形式

第75条:考虑使用自定义的序列化形式如果这个类实现了Serializable接口,并且使用了默认的序列化形式,你就永远无法彻底摆脱那个应该丢弃的实现了。它将永远牵制住这个类的序列化形式。如果没有先认真考虑默认的序列化形式是否适合,则不要贸然接受。一般来将,只有当你自行设计的自定义序列化形式与默认的序列化形式基本相同时,才能接受默认序列化形式。默认的序列化形式描述了改对象内部所包含的数据,以及...

2019-06-21 18:00:07 238

原创 跟我学(Effective Java 2)第74条:谨慎地实现Serializable接口

第74条:谨慎地实现Serializable接口序列化(object serialization)API,它提供了一个框架,用来将对象编码成字节流,以及从字节流编码中重新构建对象。“将一个对象编码成一个字节流”,这就称作序列化(serializing)该对象;相反的处理过程被称作反序列化(deserializing)。要想使一个类的实例可被序列化,非常简单,只要在它的声明中加入"impleme...

2019-06-21 17:16:40 286

原创 跟我学(Effective Java 2)第73条:避免使用线程组

第73条:避免使用线程组除了线程、锁、监视器外,系统还提供了一个基本的抽象,即线程组(thread group)。线程组的目的是作为一种隔离applet(小程序)的机制,但实际上却没达到这个目的。它没有提供线程安全性功能,而是 允许同时把线程的某些基本功能应用到一组线程上,基本上已经废弃了。从线程安全性的角度来看,ThreadGroup API非常弱。为了得到一个线程组中的活动线程列表,你必须...

2019-06-20 17:53:06 207

原创 跟我学(Effective Java 2)第72条:不要依赖于线程调度器

第72条:不要依赖于线程调度器当有多个线程可以运行时,由线程调度器(thread scheduler)决定哪些线程将会运行,以及运行多长时间。任何一个合理的操作系统在做出这样的决定时,都会努力做到公正,但是所采用的策略却大相径庭。因此,编写良好的程序不应该依赖于这种策略的细节。任何依赖于线程调度器来达到正确性或者性能要求的程序,很有可能都是不可移植的。要编写健壮的、响应良好的、可移植的多线程应...

2019-06-20 17:50:44 184

原创 跟我学(Effective Java 2)第71条:慎用延迟初始化

第71条:慎用延迟初始化延迟初始化(lazy initialization)是延迟到需要域的值时才将它初始化的这种行为。如果 永远不需要这个值,这个域就永远不会被初始化。这种方法既适用于静态域,也适用于实例域。虽然延迟初始化主要是一种优化,但它也可以用来打破类和实例初始化中的有害循环。就像大多数的优化一样,对于延迟初始化,最好建议“除非绝对必要,否则就不要这么做”( 见第55条:谨慎的进行优化...

2019-06-20 17:46:48 163

原创 跟我学(Effective Java 2)第70条:线程安全性的文档化

第70条:线程安全性的文档化在一个方法声明中出现synchronized修饰符,这是个实现细节,并不是导出的API的一部分。它并不一定表明这个方法是线程安全的。线程安全性有多种级别。一个类为了可被多个线程安全的使用,必须在文档中清楚地说明他所支持的线程安全性级别。1 不可变的(immutable)——这个类的实例是不变的。所以,不需要外部的同步。 这样的例子包括String、Long和Big...

2019-06-20 17:39:24 196

原创 跟我学(Effective Java 2)第69条:并发工具优先于wait和notify

第69条:并发工具优先于wait和notifyJava 1.5 版本发行之后,Java平台就提供了更高级的并发工具,wait和notify的组合就不主要了。既然正确的使用wait和notify比较困难,就应该用更高级的并发工具来代替。java.util.concurrent包中更高级的工具分成三类:Executor Framework、并发集合(Concurrent Collection)以及同...

2019-06-20 17:32:57 448

原创 跟我学(Effective Java 2)第68条:executor和task优先于线程

第68条:executor和task优先于线程在Java 1.5 发行版本中,Java平台中增加了java.util.concurrent。这个包中包含了Executor Framework,这是一个很灵活的基于接口的任务执行工具。它创建了一个在各方面都比工作队列更好,却只需要这一行代码:ExecutorService executor = Executors.newSingleThreadE...

2019-06-19 18:41:52 168

原创 跟我学(Effective Java 2)第67条:避免过度同步

第67条:避免过度同步ps:此条本人依然在理解中。依据情况的不同,过度同步可能会导致性能降低、死锁,甚至不确定的行为。为了避免活性失败和安全性失败,在一个被同步的方法或者代码块中,永远不要放弃对客户端的控制。换句话说,在一个被同步的区域内部,不要调用设计成要被覆盖的方法,或者是由客户端以函数对象的形式提供的方法。从包含该同步区域的角度来看,这样的方法是外来的(alien)。这个类不知道该方法...

2019-06-19 18:36:58 204

原创 跟我学(Effective Java 2)第66条:同步访问共享的可变数据

第66条:同步访问共享的可变数据关键字synchronized可以保证同一时刻,只有一个线程可以执行某个方法,或者摸一个代码块。许多人把同步的概念理解为一种互斥的方式,即,当一个对象被一个线程修改的时候,可以阻止另一个线程观察到对象内部不一致的状态。这种观点对象创建的时候处于一致的状态,当有方法访问它的时候,它就被锁定了。这种观点是正确的,但是它并不是同步的全部意义。同步不仅可以阻止一个线程看...

2019-06-19 18:07:35 172

原创 跟我学(Effective Java 2)第65条:不要忽略异常

第65条:不要忽略异常尽管这条建议看上去是显而易见的,但是它却常常被违反,因而值得再次提出来,当API的设计者声明一个方法将抛出某个异常的时候,他们等于正在试图说明某些事情。所以,请不要忽略它!要忽略一个异常非常容易,只需将方法调用通过try语句包围起来,并包含一个空的catch块。空的catch块会使异常达不到应有的目的,即强迫你处理导常的情况。忽略异常就如同忽略火警信号一样——若把火警信号...

2019-06-19 17:35:54 174

原创 跟我学(Effective Java 2)第64条:努力使失败保持原子性

第64条:努力使失败保持原子性当对象抛出异常之后,通常我们期望这个对象仍然保持在一种定义良好的可用状态之中,即使失败是发生在执行某个操作的过程中间。对于受检的异常而言,这尤为重要,因为调用者期望能从这种异常中进行恢复。一般而言,失败的方法调用应该使对象保持在被调用之前的状态。具有这种属性的方法被称为具有失败原子性。有几种途径可以实现这种效果。1 最简单的办法莫过于设计一个不可变的对象(见第1...

2019-06-19 17:26:11 170

原创 跟我学(Effective Java 2)第63条:在细节消息中包含能捕获失败的信息

第63条:在细节消息中包含能捕获失败的信息当程序由于未被捕获的异常而失败的时候,系统会自动打印该异常的信息,在堆栈中包含该异常的字符串表示法,即它的toString方法的调用结果,包含了一系列信息:该异常的类名和细节消息。通常,这是程序员在调查程序失败原因的必要的信息。如果这个失败不易重现,这失败的信息就异常重要,异常的细节消息应该捕获住失败,便于以后分析。为了捕获失败,异常的细节信息应该包含...

2019-06-18 17:57:39 153

原创 跟我学(Effective Java 2)第62条:每个方法抛出的异常都要有文档

第62条:每个方法抛出的异常都要有文档描述一个方法所抛出的异常,是正确使用这个方法时所需文档的重要组成部分。因此,花点时间仔细的为每个方法抛出的异常建立文档是特别重要的。始终要单独的声明受检的异常,并且利用Javadoc的@throws标记,准确的记录下抛出每个异常的条件。如果一个方法可能抛出多个异常类,则不要使用“快捷方式”声明他会抛出这些异常类的某个超类。这样的声明不仅没有为程序员提供关于...

2019-06-18 17:52:22 171

原创 跟我学(Effective Java 2)第61条:抛出与抽象相对应的异常

第61条:抛出与抽象相对应的异常如果方法抛出的异常与它所执行的任务没有明显的联系,这种情形物会使人不知所措。当方法传递由低层抽象抛出的异常时,往往会发生这种情况。除了使人感到困惑之外,这也让实现细节污染了更高层的API。如果高层的实现在后续的发行版本中发生了变化,它所抛出的异常也可能会跟着发生变化,从而潜在地破坏现有的客户端程序。为了避免这个问题,更高层的实现应该捕获低层的异常,同时抛出可以按...

2019-06-18 17:48:16 331

原创 跟我学(Effective Java 2)第60条:优先使用标准的异常

第60条:优先使用标准的异常高手可以高度的重用,异常也不例外。java平台提供了一系列基本的未受检的异常,满足了绝大多数API的异常抛出需求。重用现有异常有很多好处。其中最主要的好处是,他使你的API更加易于学习和使用,因为他与程序员已经熟悉的习惯用法是一致的。第二个好处是,对于用到这些API的程序而言,他们的可读性会更好,因为他们不会出现很多程序员不熟悉的异常。最后(也是最不重要的)一点是,...

2019-06-18 17:41:24 179

原创 跟我学(Effective Java 2)第59条:避免不必要地使用受检的异常

第59条:避免不必要地使用受检的异常受检的异常是Java设计语言的一项很好的特性。与返回代码不同,他们强迫程序员处理异常的条件,大大增强了可靠性。也就是说,过分使用受检的异常会使API使用起来非常不方便。如果方法抛出一个或者多个受检的异常,或者他必须声明他抛出这些异常,并让他们传播出去。无论哪种方法,都给程序员增添了不可忽视的负担。如果正确的使用API并不能组织这种异常条件的产生,并且一点产生...

2019-06-18 17:39:14 205

原创 跟我学(Effective Java 2)第58条:对可恢复的情况使用受检异常,对编程错误使用运行时异常

第58条:对可恢复的情况使用受检异常,对编程错误使用运行时异常java 程序设计语言可抛出三种结构(Throwable):受检异常(Checked Excepction)、运行时异常(RunTimeException)、错误(Error)。在决定使用受检的异常或是或受检的异常时,主要的原则是:如果期望调用者能够适当恢复,对于这种情况就应该使用受检的异常。通过抛出受检的异常,强迫调用者在一个ca...

2019-06-17 17:51:09 592

原创 跟我学(Effective Java 2)第57条:只针对异常的情况才使用异常

第57条:只针对异常的情况才使用异常 try { int i = 0; while (true){ range[i++].climb(); } }catch (ArrayIndexOutOfBoundsException e){ }这段代码明显是想让数组一...

2019-06-17 17:42:53 192

原创 跟我学(Effective Java 2)第56条:遵守普遍接受的命名惯例

第56条:遵守普遍接受的命名惯例不严格的讲,这些命名惯例分为两大类:字面的和语法的。字面的命名惯例比较少,但也涉及包,类,方法,域和类型变量。包的名称应该是层次状的,用句号分隔每个部分。 任何将在你的组织之外使用的包,其名称都应该以你的组织的Internet域名开头,并且将顶级域名放在前面,例如edu.cmu , com.sun ,gov.nsa。标准类库和一些可选的包,其名称以java和j...

2019-06-17 17:32:27 139

原创 跟我学(Effective Java 2)第55条:谨慎地进行优化

第55条:谨慎地进行优化优化的弊大于利,特别是不成熟的优化。在优化过程中,产生的软件可能既不快速,也不正确,而且还不容易修正。不要因为性能而牺牲合理的结构。要努力编写好的程序而不足快的栏序。如果好的程序不够快,它的结构将使它可以得到优化。好的程序体现了信息隐藏 (information hiding)的原则:只要有可能,它们就会把设计决策集中在单个模块中,因此,可以改变单个决策,而不会影响到系...

2019-06-17 17:23:40 165

原创 跟我学(Effective Java 2)第54条:谨慎地使用本地方法

第54条:谨慎地使用本地方法JNI (java native interface) 允许java 应用程序调用本地方法(native method)。本地方法:本地程序设计语言编写的特殊方法(比如C 或C++ 代码),并返回到java设计语言。本地方法主要提供三种用途:1 访问“特定于平台的能力”的机制,比如 注册表、文件锁。2 访问遗留代码库的能力,可以访问遗留数据。3 可以通过本地...

2019-06-17 17:18:06 774

原创 跟我学(Effective Java 2)第53条:接口优先于反射机制

第53条:接口优先于反射机制核心反射机制:java.lang.reflect包 提供了“通过程序来访问关于已装载的类的信息”的能力,给定一个Class实例,可以获得Constructor、Method、Field实例,这些对象提供“通过程序来访问类的成员名称、域类型、方法签名等信息”的能力。反射机制允许一个类使用另一个类,即使当前者被编译的时候后者还根本不存在,存在的代价:1.失去编译时类型...

2019-06-14 19:02:08 201

原创 跟我学(Effective Java 2)第52条:通过接口引用对象

第52条:通过接口引用对象第40条有一个建议:对于参数类型,要优先使用接口而不是类。通俗地讲,应该优先使用接口而不是类来引用对象。如果有合适的接口类型存在,那么对于参数、返回值、变量和域来说,就应该使用接口类型来声明。只有当你利用构造函数创建某个对象的时候,才真正引用这个对象的类。在声明变量的时候应该养成这样的习惯:List<String> list= new Vector&lt...

2019-06-14 18:56:31 219

原创 跟我学(Effective Java 2)第51条:当心字符串连接的性能

第51条:当心字符串连接的性能字符串连接操作符(+)是把多个字符串合并为一个字符串的便利途径。要想产生单独一行的输出,或者构造一个字符串来表示一个较小的、大小固定的对象,使用连接操作符是非常合适的,但是它不适合运用在大规模的场景中。为连接n个字符串而重复地使用字符串连接操作符,需要n的平方级的时间。这是由于字符串不可变而导致的不幸结果。当两个字符串被连接在一起时,他们的内容都要被拷贝。publ...

2019-06-14 18:36:17 131

原创 跟我学(Effective Java 2)第50条:如果其他类型更合适,则尽量避免使用字符串

第50条:如果其他类型更合适,则尽量避免使用字符串字符串被用来表示文本,它在这方面很好用。因为字符串很通用。但是这里要说明的是,一些不适合用字符串的情况。1.字符串不适合代替其他的值类型。 只有当数据确实是文本信息时,才应该使用字符串,如果是数值,就应该被转换为适当的数值类型,如果是一个“是-或-否”的问题答案,应该被转换为boolean类型,如果是一个对象,应该使用对象引用来引用它。2.字...

2019-06-14 18:29:45 175

原创 跟我学(Effective Java 2)第49条:基本类型优先于装箱基本类型

第49条:基本类型优先于装箱基本类型Java的类型 分两种 1 基本类型, 2 引用类型;装箱基本类型属于 引用类型基本类型和装箱基本类型之间的三个主要区别:1.基本类型只有值,而装箱基本类型具有与它们的值不同的同一性(两个装箱基本类型可以具有相同的值和不同的同一性)2.基本类型只有功能完备的值,而每个装箱基本类型除了它对应的基本类型的所有功能值之外,还有个非功能值:null3.基本类型...

2019-06-14 18:17:19 163

原创 跟我学(Effective Java 2)第48条:如果需要精确的答案,请避免使用float和double

第48条:如果需要精确的答案,请避免使用float和doublefloat和double主要为了科学计算和工程计算而设计,执行二进制浮点运算,这是为了在广泛的数值范围上提供较为精确的快速近似计算而精心设计的。然而,它们没有提供完全精确的结果,所以不适合用于需要精确结果的场合,尤其是货币计算。System.out.println(1.03 - .42);//0.6100000000000001...

2019-06-14 17:57:06 147

原创 跟我学(Effective Java 2)第47条:了解和使用类库

第47条:了解和使用类库假设希望产生位于0到某个上界之间的随机整数。可能会这样编写:private static final Random rnd = new Random();static int random(int n){ return Math.abs(rnd.nextInt()) % n;}这个方法看起来可能不错,但是却有三个缺点。第一个缺点是,如果n是一个比较小的2...

2019-06-13 18:54:46 136

原创 跟我学(Effective Java 2)第46条:for-each循环优先于传统的for循环

第46条:for-each循环优先于传统的for循环for-each循环通过完全隐藏迭代器或者索引变量,避免混乱和出错的可能,适用于集合和数组和任何实现Iterable接口的对象。enum Suit { CLUB, DIAMOND, HEART, SPADE }enum Rank { ACE, DEUCE, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT,NINE...

2019-06-13 18:40:00 190

原创 跟我学(Effective Java 2)第45条:将局部变量的作用域最小化

第45条:将局部变量的作用域最小化将局部变量的作用域最小化,可以增强个代码的可读性和可维护性,并降低出错的可能性。C语言要求局部变量必须在一个代码块的开头出进行声明,出于习惯,有些程序员依旧沿着这个习惯,这个习惯应该改正。在此提醒,java允许你在任何可以出现语句的地方声明变量。1.要使局部变量的作用域最小化,最有力的方法就是在第一次使用它的地方声明。 如果变量在使用之前声明,对于试图理解程...

2019-06-13 18:19:04 155

原创 跟我学(Effective Java 2)第44条:为所有导出的API元素编写文档注释

第44条:为所有导出的API元素编写文档注释如果要想使一个API真正可用,就必须为其编写文档。传统意义上的API文档是手动生成的,所以保持文档与代码同步是一件很繁琐的事情。Java环境提供了一种被称为Javadoc的实用工具,从而使这项任务变得很容易。Javadoc利用特格式的文档注释,根据源代码自动产生API文档。文档注释三部分:1.简述。文档中,对于属性和方法都是先有一个列表,然后才在后...

2019-06-13 18:03:48 219

原创 跟我学(Effective Java 2)第43条:返回零长度的数组或者集合,而不是null

第43条:返回零长度的数组或者集合,而不是nullprivate final List<Cheese> cheesesInStock = ...;public Cheese[] getCheese() { if(cheesesInStock.size() == 0) return null; ...}如果单独返回一个null 值,这样做会要求客...

2019-06-13 17:53:26 187

原创 跟我学(Effective Java 2)第42条:慎用可变参数

第42条:慎用可变参数Java 1.5发行版本中增加了可变参数方法。可变参数方法接受0个或者多个指定类型的参数。可变参数机制通过先创建一个数组,数组的大小为在调用位置所传递的参数数量,然后将参数值传到数组中,最后将数组传递给方法。例如下面有个例子,返回多个参数的和:static int sum(int... args) { int sum=0; for(int arg : a...

2019-06-12 19:17:15 182

原创 跟我学(Effective Java 2)第41条: 慎用重载

第41条: 慎用重载下面是一个关于集合的例子,对set和list进行分类:public class CollectionClassifier { public static String classify(Set<?> s) { return "Set"; } public static String classify(List<?&...

2019-06-12 18:53:58 140

原创 跟我学(Effective Java 2)第40条:谨慎设计方法签名

第40条:谨慎设计方法签名1.谨慎地选择方法的名称。 遵循标准的命名习惯。2.不过于追求提供便利的方法。 方法太多会使类难以学习、使用、文档化、测试和维护。3.避免过长的参数列表。 目标是四个参数以下。缩短参数列表的方法:(1)把方法分解成多个方法,可能会导致方法过多, 通过提升方法正交性,可以减少方法数目。java.util.List接口,它没有提供在子列表中查找元素第一个索引和最后一...

2019-06-12 18:09:36 129

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除