Java SE中必可避免的会学到new关键字(用以创建对象),之后又了解到了克隆以及反射都可以创建对象。。今天又学到了静态工厂以及构建器,所以呢,在此做一个小结。

下面我先以创建对象的几种方式开始讲起,然后在优化构造器用以创建对象(即为何尽量使用构建器而不是其他的几种),介绍的不周到的地方还请大佬见谅,我还是个弟弟~~~~

创建对象五种方式

  • new关键字

语法:类名 对象名=new 类名();

Student student1=new Student("小刘",22);

  • 反射:Class类的newInstance方法

语法:java.lang.Class Class 类对象名称=java.lang.Class.forName(要实例化的类全称);类名 对象名=(类名)Class类对象

名称.newInstance();

Class cl=Class.forName("Student");

Student student2=(Student)cl.newInstance();

  • 反射:Constructor类的newInstance方法

Constructor<Student> constructor = Student.class.getInstance()
           Student stu3 = constructor.newInstance();

注意:对于构造器的反射还可以解析私有构造器,反射还可以解析一个类的方法还有属性,详情看我另外一篇博客或者百度。。

Class classPer1=Class.forName("demo.Person");
//int为Person类私有构造器中的参数,如果为多参则依次添加多个参数的类即可
Constructor constructor=classPer1.getDeclaredConstructor(int.class);
//暴力反射
constructor.setAccessible(true);
Person person=(Person) constructor.newInstance(2);
  • 克隆:object.clone() (不常用)

语法:类名对象名=(类名)已创建好的类对象名.clone();

Student student3=(Student)student2.clone();

  • 对象的反序列化

ObjectInputStream in = new ObjectInputStream(new FileInputStream("data.obj"));

对上述示例的说明如下:

  • new 关键字:调用类的无参构造方法,也是java中高耦合的罪魁祸首。
  • Class 对象的 newInstance():调用类的无参构造方法。Class的newInstance方法内部是调用Constructor的newInstance()方法。其实这也是众多框架Spring、Hibernate、Struts等使用后者的方式。
  • Constructor类的 newInstance():调用类的无参认构造方法,或者有参构造。
  • Object 类的 clone() :必须实现 Cloneable 接口。不会调用类的构造方法,它会创建一个复制的对象,这个对象和原来的对象具有不同的内存地址,但它们的属性值相同。
  • 对象的反序列化:不会调用类的构造方法

优化过程

  • 构造器

问题:参照静态工厂的优点就是它的问题。。

  • 静态工厂

优点:

有名称,便于阅读。

Singleton

可以返回任意子类型的对象,提高了灵活性。

创建参数化实例的时候,它使得代码变得简单。

缺点:不能很好地扩展到大量的可选参数,即对类中大量的属性实例化不能很好地解决。

模板:

package serviceprovider;public class Car {private int price;private int length;private int height;private int width;private String color;private static final Car redCar = new Car("red");private static final Car blueCar = new Car("blue");private static final Car bestSaleCar = new Car(350000, 3, 2, 2, "blue");public Car(int price) {super();this.price = price;}public Car(int price, int length, int height, int width, String color) {super();this.price = price;this.length = length;this.height = height;this.width = width;this.color = color;}public Car(String color) {super();this.color = color;}/*** 下面是静态工厂方法*/public static Car getRedCar(){return redCar;}public static Car getBlueCar(){return blueCar;}/*** 获取这个季度卖的最好的车* @return*/public static Car getBestSaleCar(){return bestSaleCar;}}
  • 重叠构造器,即第一个构造方法只提供必要参数,第二个构造器有一个可选参数,第三个构造器有两个可选参数。。直到最后一个构造以包含了所有的可选参数

优点:可行

缺点:当有许多参数的时候,客户代码很难编写,并且任然难以阅读。

  • Javabean方式,即setter和getter方法

优点:与重叠构造器类似,可行。

缺点:Javabean模式自身有着很严重的缺点,构造过程被分到了几个调用中,在构造过程中可能处于不一致的状态,并且还需

要程序员付出额外的努力来确保它的线程安全。

  • 构建器

优点:保证像重叠构造器那样的安全性,也能保证像Javabean模式那么好的可读性。

缺点:可能就是在创建对象之前,必须先创建它的构建器。。

示例:

public class  NutritionFcts{private final int servingSize;private final int servings;private final int calories;private final int fat;private final int sodium;private final int carbohydrate;public static class Builder{//Required parametersprivate int servingSize;private int servings;//Optional parameters---initalized to default valuesprivate int calories=0;private int fat=0;private int carbohydrate=0;private int sodium=0;public Builder(int servingSize,int servings){this.servings=servings;this.servingSize=servingSize;}public Builder calories(int val){calories=val;return this;}public Builder fat(int val){fat=val;return this;}public Builder carbohydrate(int val){carbohydrate=val;return this;}public Builder sodium(int val){sodium=val;return this;}public NutritionFcts builder(){return new NutritionFcts();}}private NutritionFcts(Builder builder){servingSize=builder.servingSize;servings=builder.servings;calories=builder.calories;fat=builder.fat;carbohydrate=builder.carbohydrate;sodium=builder.sodium;}
}//客户端代码NutritionFcts cocaCola=new NutritionFcts.Builder(200,20).calories(100).fat(20).carbohydrate(65).sodium(89).builder();

通用生成对象Generator(可做工具类)

1、申明一个Generator接口,提供一个next()方法,用以返回一个新的类对象。

public interface Generator<T> {
   T next();
}

2、定义一个BasicGenerator类,对Generator接口进行实现,用以生成某个类的对象。通过create()方法创建新的对象,使用泛型参数。

package generator;

/**
 * @author wangjie
 * @version 2018/11/19
 * 一个通用的generator
 */
public class BasicGenerator<T> implements Generator<T> {
    private Class<T> type;
    public BasicGenerator(Class<T> type){
        this.type = type;
    }
    @Override
    public T next(){
        try{
            return type.newInstance();
        }catch(Exception e){
            throw new RuntimeException(e);
        }
    }

public static <T> Generator<T> create(Class<T> type){
        return new BasicGenerator<T>(type);
    }

}

3、定义一个具有默认构造器的简单类:这个类CountedObject能够实现计数功能,告诉我们创建了几个CountedObject实例,并通过toString()方法打印其编号。

package generator;

/**
 * @author wangjie
 * @version 2018/11/19
 */
public class CountedObject {
    private static long counter = 0;
    private final long id = counter++;
    public long id(){ return id; }
    public String toString(){ return "CountedObject " + id; }
}

4、此时,可以使用BasicGenerator很容易地为CountedObject类创建一个Generator:

package generator;

/**
 * @author wangjie
 * @version 2018/11/19
 */
public class BasicGeneratorDemo {
    public static void main(String[] args) {
        Generator<CountedObject> gen = BasicGenerator.create(CountedObject.class);
        for (int i = 0; i < 5; i++) {
            System.out.println(gen.next());
        }
    }
}

Java创建对象小结相关推荐

  1. Java中文编码小结

    Java中文编码小结 1. 只有 字符到字节 或者 字节到字符 的转换才存在编码转码; 2. Java String 采用 UTF-16 编码方式存储所有字符.unicode体系采用唯一的码点表示唯一 ...

  2. java创建对象的过程_Java创建对象的过程

    Java创建对象的过程 Java是一门面向对象的编程语言,在Java程序运行过程中每时每刻都有对象被创建出来.在语言层面上,创建对象通常仅仅是一个new关键字而已,而在虚拟机中,对象的创建又是怎样一个 ...

  3. java创建对象 的初始化顺序

    java创建对象 的初始化顺序 1.初始化块 初始化块通常写在类的构造方法之前,由花括号括起来,通常包含对成员属性进行初始化的语句: 初始化块分为instance初始化块和static初始化块,初始化 ...

  4. Java创建对象的方式——反序列化创建对象

    目录 Java创建对象的几种方式 反序列化创建对象 思路 代码示例 Java创建对象的几种方式 Java创建对象的方式共有4种.分别为: 1.通过new语句实例化一个对象. 2.通过反射机制创建对象. ...

  5. java创建对象实例的四种方式

    java创建对象的方法常用的有四种:使用new关键字.利用java的反射机制.实现Cloneable接口使用克隆方法以及利用java序列化和反序列化实现创建对象. 不说那么多,直接上代码.本次主要讲前 ...

  6. Java创建对象方式初谈

    Java创建对象的四种方式 1.通过new创建对象 通过new的方式创建对象是Java中最常见的方式,也是我们最开始学习创建对象的方式,但是我们通过new创建对象都会增加整体的耦合度,我们在今后的编程 ...

  7. java创建对象的五种方式

    java创建对象的五种方式 一.使用new关键字 二.使用clone方法 三.使用反序列化 四.使用反射 五.使用Unsafe 一.使用new关键字 如 User user=new User(); 执 ...

  8. Java创建对象过程:类的初始化和实例化

    文章目录 前言 一.类的初始化 二.类的实例化 前言 Java对象的创建过程往往包括类初始化和类实例化两个阶段.类的初始化在前.类的实例化在后. 注意:这与spring的bean正好相反,spring ...

  9. Java 创建对象的 6 种方式,总有一种适合你

    创建对象的 6 种方式 假设有个女朋友类: @Data @NoArgsConstructor @AllArgsConstructor class GirlFriend {private String ...

最新文章

  1. jenkins+docker的简单项目部署
  2. 应用语言学 计算机语言学,应用语言学的名词解释
  3. 试题 基础练习 回文数
  4. python的命名空间_python中命名空间的三种方式介绍(附示例)
  5. oracle使用sqlplus查询sql格式
  6. python with关键字_python中用with关键字来实现上下文管理器.
  7. flinkTime与Window入门详解
  8. mdl文件是c语言,MDL文件扩展名 - 什么是.mdl以及如何打开? - ReviverSoft
  9. 没想到一个起点中文网都可以掀起这么大的波澜
  10. 3D Photography using Context-aware Layered Depth Inpainting
  11. java gdal开源库_基于GDAL库,读取.grd文件(以海洋地形数据为例)Java版
  12. gpu内存大小 android,Android性能测试(内存、cpu、fps、流量、GPU、电量)——adb篇...
  13. 10月11日科技联播:美股暴跌引全球股市崩盘;腾讯跌出全球市值前十
  14. webservice 405 java_用浏览器测试Get与Post Webservice,Post一直报405错误,而Get能够成功的原因与解决方法...
  15. POJ 1659 Frogs‘ Neighborhood (Havel 定理)
  16. Word中的TIF图像保存后再打开就模糊了
  17. linux把u盘只读文件,完美解决linux下U盘文件只读的问题
  18. CREATE DATABASE failed
  19. 一文弄懂Word2Vec之skip-gram(含详细代码)
  20. 微信小程序:简洁界面清爽让人非常舒服的一款短视频去水印微信小程序

热门文章

  1. 《三体》动画版官宣!B站出品 刘慈欣“倒吸一口凉气”
  2. 小米618战报出炉!三平台狂揽156项第一
  3. 老员工在线“黑”华为:早期手机难看丢人 习惯另外带苹果三星
  4. 中国移动:手机上网流量单价累计同比下降62%
  5. malloc()与 alloc()区别(转)
  6. 干货:使用Fastapi开发自己的Mock server(附源码)
  7. [编程手记小技巧]自定义调试信息宏及gcc技巧
  8. 为啥我从后台查到的值在页面显示的是undefined_【java笔记】046天,作购物车页面,学习JavaScript...
  9. post工具_GitHub CLI 命令行工具使用
  10. 页面文件太小无法完成操作_PPT操作界面基础解析