写点什么

【Java 程序员必知必会的 90 个细节】1,java 面试题选择题

用户头像
极客good
关注
发布于: 刚刚

Set<Rank> faceCards = EnumSet.of(JACK,QUEEN,KING);


3、valueOf


比 from 和 of 更繁琐的一种替代方法。


BigInteger prime = BigInteger.valueOf(Integer.MAX_VALUE);


4、instance 或者 getInstance,返回的实例是通过方法的参数来描述的。


StackWalker luke = StackWalker.getInstance(options);


5、create 或者 newInstance,和 instance 和 getInstance 一样,但 create 和 newInstance 能够确保每次调用都返回一个新的实例。


Object newArray = Array.newInstance(classObject,arrayLen);


6、getType,像 getInstance 一样,但是在工厂方法处于不同类中的时候使用。Type 表示工厂方法所返回的对象类型。


FileStore fs = Files.getFileStore(path);


7、newType,像 newInstance 一样。


8、type,getType 和 newType 的简版


四、总结




简而言之,静态工厂方法和共有构造器都各有好处,我们需要理解它们各自的长处。


静态工厂方法更加合适,因此切忌第一反应就是提供公有的构造器,而不考虑静态工厂。


第 2 条:遇到多个构造器参数时要考虑使用构建器


======================


静态工厂和构造器有个共同的局限性:它们都不能很好地扩展到大量的可选参数。


1、重叠构造器




重叠构造器可行,但是当许多参数的时候,客户端代码会很难编写并且难以阅读。


2、JavaBeans 模式




先调用无参构造器来创建对象,然后调用 setter 方法来设置每个必要的参数。


JavaBeans 模式是我常用的方式,但是 JavaBeans 也有着很严


【一线大厂Java面试题解析+核心总结学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


重的缺点。因为构造过程被分到了几个调用中,在构造过程中 JavaBean 可能处于不一致的状态。类无法通过检验构造器参数的有效性来保证一致性。


3、建造者模式(并非设计模式中的建造者模式)




幸运的是,还有第三种替代方法。它既能像重叠构造器模式的安全性,又能保证像 JavaBeans 模式那样的可读性。这就是建造者模式。


package com.guor.effective.chapter2.worker;


public class Worker {


private int id;


private String name;


private int age;


private int sex;


private String school;


private String address;


public static class Builder{


private int id;


private String name;


private int age = 18;


private int sex = 1;


private String school = "辽宁石油化工大学";


private String address = "辽宁省大连市高新园区";


public Builder(int id, String name) {


this.id = id;


this.name = name;


}


public Builder age(int val){


age = val;


return this;


}


public Builder sex(int val){


sex = val;


return this;


}


public Builder school(String val){


school = val;


return this;


}


public Builder address(String val){


address = val;


return this;


}


public Worker build() {


return new Worker(this);


}


}


public Worker(Builder builder){


int id = builder.id;


String name = builder.name;


int age = builder.age;


int sex = builder.sex;


String school = builder.school;


String address = builder.address;


}


@Override


public String toString() {


return "Worker{" +


"id=" + id +


", name='" + name + ''' +


", age=" + age +


", sex=" + sex +


", school='" + school + ''' +


", address='" + address + ''' +


'}';


}


}


package com.guor.effective.chapter2.worker;


public class Test {


public static void main(String[] args) {


Worker worker = new Worker


.Builder(1,"郭晓彤").age(1).sex(1).school("中铁诺德幼儿园")


.address("中铁诺德滨海花园").build();


System.out.println(worker.toString());


}


}


第 3 条:用私有构造器或者枚举类型强化 Singleton 属性


=============================


第 4 条:通过私有构造器强化不可实例化的能力?


======================


package com.guor.effective.chapter2.test;


public class Test2 {


private Test2(){


System.out.println("我是一个私有构造器");


}


public static void constructor() {


System.out.println("我是一个工具类");


}


}



第 5 条:优先考虑依赖注入来引用资源


=================


第 6 条:避免创建不必要的对象


==============


1、自动装箱




创建多余对象的方法,有一种叫自动装箱,它允许程序员将基本类型和封装类型混用,按需要自动装箱和拆箱。自动装箱使得基本类型和装箱基本类型之间的差别变得模糊起来,但是并没有完全消除,它们在语义上还有着微妙的差别,在性能上也有着明显的差别。


举例说明,计算所有 int 正整数值的总和。


(1)基本类型性能测试


package com.guor.effective.chapter2.test;


public class getIntSum {


public static void main(String[] args) {


long a= System.currentTimeMillis();//获取当前系统时间(毫秒)


long sum = 0;


for (int i = 0; i < Integer.MAX_VALUE; i++) {


sum += i;


}


System.out.println("int 正整数之和:"+sum);


System.out.println("程序执行时间为:"+(System.currentTimeMillis()-a)+"毫秒");


}


}


(2)封装类型性能测试?


Long 比 long 时间差的还是挺悬殊的。要优先使用基本类型,而不是封装类型,要当心无意识的自动装箱。


2、创建有意义的小对象




不要错误的认为此条所介绍内容暗示着“创建对象的代价非常昂贵,我们应该尽可能的创建对象”。相反,由于小对象的构造器只做少量的显示工作,所以小对象的创建和回收工作是非常廉价的,特别是在现代的 JVM 实现上更是如此。通过创建附加的对象提升程序的清晰性、简洁性、功能性,这通常是件好事。反之,通过维护自己的对象池来避免创建对象,并不是一种好的做法,除非池中的对象是非常重量级的,正确使用对象池的典型示例就是数据库连接池。建立数据库连接的代价是非常昂贵的,因此重用这些对象非常有意义。一般而言,维护自己的对象池,一般会将代码变得很乱,同时增加内存占用,而且还会损害性能。现代的 JVM 实现具有高度优化的垃圾回收器,其性能很容易就会超过轻量级对象池的性能。


第 7 条:消除过期的对象引用


=============

用户头像

极客good

关注

还未添加个人签名 2021.03.18 加入

还未添加个人简介

评论

发布
暂无评论
【Java程序员必知必会的90个细节】1,java面试题选择题