深入理解 Java 泛型工厂方法:类型安全与灵活性的结合

深入理解 Java 泛型工厂方法:类型安全与灵活性的结合

泛型工厂方法是指使用泛型参数来创建对象的静态方法。它可以返回与传入类型参数一致的实例,从而确保类型安全并提高代码的灵活性和重用性。

1. 基本实现

泛型工厂方法通常接受一个 Class 对象作为参数,并返回该类的实例。以下是一个基本的实现示例:

public class Factory {public static <T> T createInstance(Class<T> clazz) throws IllegalAccessException, InstantiationException {return clazz.newInstance();}
}

在这个例子中,createInstance 方法是一个泛型方法,接受一个 Class 类型的参数,并返回一个类型为 T 的实例。该方法使用 clazz.newInstance() 来创建实例,这种方式要求 T 必须有一个无参构造函数。

2. 使用示例

假设有一个简单的类 Product,可以通过泛型工厂方法来创建它的实例:

public class Product {private String name;public Product() {this.name = "Default Product";}public String getName() {return name;}public void setName(String name) {this.name = name;}
}

使用泛型工厂方法来创建 Product 的实例:

public class Main {public static void main(String[] args) {try {Product product = Factory.createInstance(Product.class);System.out.println(product.getName());} catch (InstantiationException | IllegalAccessException e) {e.printStackTrace();}}
}

输出结果:

Default Product

3. 改进实现

Java 8 引入了 Supplier 接口,可以用来简化泛型工厂方法的实现,避免使用反射创建实例。下面是一个改进的示例:

import java.util.function.Supplier;public class Factory {public static <T> T createInstance(Supplier<T> supplier) {return supplier.get();}
}

使用 Supplier 的实现:

public class Product {private String name;public Product() {this.name = "Default Product";}public String getName() {return name;}public void setName(String name) {this.name = name;}
}
public class Main {public static void main(String[] args) {Product product = Factory.createInstance(Product::new);System.out.println(product.getName());}
}

4. 创建具有参数化构造函数的实例

通过 Supplier 接口的方法无法直接创建具有参数化构造函数的实例。在这种情况下,可以使用 Function 接口:

import java.util.function.Function;public class Factory {public static <T, R> T createInstance(Function<R, T> function, R arg) {return function.apply(arg);}
}

示例类:

public class Product {private String name;public Product(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}

使用 Function 来创建具有参数化构造函数的实例:

public class Main {public static void main(String[] args) {Product product = Factory.createInstance(Product::new, "Custom Product");System.out.println(product.getName());}
}

输出结果:

Custom Product

5. 总结

泛型工厂方法通过使用泛型参数和反射或函数式接口,能够动态地创建类型安全的对象实例。它可以显著提高代码的灵活性和可重用性,避免硬编码特定类型的创建逻辑。掌握泛型工厂方法的使用,对于编写高效、灵活且可维护的 Java 代码具有重要意义。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/22522.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【excel】设置二级可变联动菜单

文章目录 【需求】在一级菜单选定后&#xff0c;二级菜单联动显示一级菜单下的可选项【步骤】step1 制作辅助列1.列转行2.在辅助列中匹配班级成员 step2 名称管理器step3 制作二级下拉菜单step4 消除二级菜单中的空白 【总结】 之前做完了 【excel】设置可变下拉菜单&#xff…

为什么一线大厂都在高薪抢 AI 产品经理?

前言 不知道你是否听过“移动互联网产品经理”这个说法&#xff0c;当移动互联网成为整个互联网行业的基础建设&#xff0c;深入到各行各业&#xff0c;所有产品经理&#xff0c;其实都是移动互联网产品经理。 而近些年&#xff0c;随着 AI 技术逐渐落地和市场认可度的不断提…

公安视频图像信息数据库及GA/T 1400视图库视频监控系统的使用场景

随着科技的快速发展&#xff0c;大数据、人工智能等新技术不断融入各行各业&#xff0c;为各行各业带来了前所未有的变革。在公安领域&#xff0c;GA/T 1400协议公安视频图像信息数据库的应用为视频监控场景提供了强有力的支持&#xff0c;极大地提升了公安工作的效率和准确性。…

C++ XML文件和解析

XML&#xff08;可扩展标记语言&#xff09;是一种用于存储和传输数据的标记语言。它具有自描述性和平台无关性的特点。XML 文档的格式主要由一组嵌套的元素和属性构成&#xff0c;结构清晰&#xff0c;易于理解和解析。 XML 文档的基本格式 一个 XML 文档通常包括以下部分&a…

大模型狂奔不息的300天

大模型行业正如火如荼地发展着&#xff0c;那么&#xff0c;如何解读当前国内大模型行业的发展&#xff1f;谁又可能是大模型时代的超级应用&#xff1f;或许后一个问题的答案&#xff0c;现在还未能揭晓。一起来看看本文关于大模型行业发展的解读和分析。 2023年&#xff0c;没…

一个小时搞定JAVA面向对象(6)——多态

文章目录 多态多态条件下成员的访问特点成员变量成员方法 多态的好处多态的缺点多态中的转型向上转型向下转型类型转换异常 多态 多态必须要子父类继承或者接口实现关系,必须有方法的重写. 定义格式: ​ new对象:父类引用指向子类对象 Fu fu new Zi( )理解为大类型接收了一…

持续总结中!2024年面试必问 20 道 Kafka面试题(六)

上一篇地址&#xff1a;持续总结中&#xff01;2024年面试必问 20 道 Kafka面试题&#xff08;五&#xff09;-CSDN博客 十一、Zookeeper 对于 Kafka 的作用是什么&#xff1f; Apache ZooKeeper是一个开源的分布式协调服务&#xff0c;它为分布式应用提供一致性服务&#xf…

Linux线程 -- 互斥锁 和 条件变量

在多线程编程中&#xff0c;互斥量&#xff08;mutex&#xff09;是用于保护共享资源的同步机制&#xff0c;确保在任一时刻只有一个线程能够访问共享资源。互斥量用于防止竞态条件&#xff08;race conditions&#xff09;&#xff0c;确保数据一致性。 基本概念 互斥量&…

python学习笔记-04

高级数据类型 一组按照顺序排列的值称为序列&#xff0c;python中存在三种内置的序列类型&#xff1a;字符串、列表和元组。序列可以支持索引和切片的操作&#xff0c;第一个索引值为0表示从左向右找&#xff0c;第一个索引值为负数表示从右找。 1.字符串操作 1.1 切片 切片…

不同平台账号究竟要如何运营?新媒体矩阵这样做,不怕没结果!

干货分享 越来越多企业要求做矩阵化运营&#xff0c;众多平台一把抓&#xff0c;那么对于新媒体人来说&#xff0c;可能会有些困惑&#xff0c;都是新媒体平台&#xff0c;他们各有什么特质&#xff1f;今天冲鸭老师就对目前新媒体4大热榜平台进行分析。 抖音 用户特点 年轻…

Flutter 中的 ErrorWidget 小部件:全面指南

Flutter 中的 ErrorWidget 小部件&#xff1a;全面指南 Flutter 是一个由 Google 开发的跨平台 UI 框架&#xff0c;它允许开发者使用 Dart 语言构建高性能、美观的应用。在 Flutter 的丰富组件库中&#xff0c;ErrorWidget 是一个特殊的组件&#xff0c;用于在渲染过程中捕获…

Unity 编辑器扩展 一键替换指定物体下的所有材质球

先看效果 实现方案 1&#xff1a;创建几个用于测试的Cube 2&#xff1a;创建一个脚本 3:编写脚本内容 主要是这部分的逻辑 附上完整代码 using System.Collections; using System.Collections.Generic; using UnityEditor; using UnityEngine;public class Tool {[MenuItem(…

json文件操作和异常处理

目录 按行读取文件readline() 读取大文件: json文件: json文件介绍: json的语法&#xff1a; 读取json文件: json文件写入: 异常&#xff1a; 捕获异常: 捕获指定类型的异常: 捕获未知类型的异常(使用最多): 异常捕获的完整结构: 异常传递: ​编辑抛出异常: 按行…

[HDCTF 2023]Normal_Rsa(e,phi不互素)

题目&#xff1a; from Crypto.Util.number import * mbytes_to_long(bxxxxxx) pgetPrime(256) qgetPrime(256) e74 np*q cpow(m,e,n) print("p",p) print("q",q) print("c",c) #p 8605358291738634342256717476404047103323438810696848883487…

如何评价GPT-4o?【模板】

如何评价GPT-4o? 简介&#xff1a;最近&#xff0c;GPT-4o横空出世。对GPT-4o这一人工智能技术进行评价&#xff0c;包括版本间的对比分析、GPT-4o的技术能力以及个人感受等。 提醒&#xff1a;在发布作品前&#xff0c;请把不需要的内容删掉。 方向一&#xff1a;对比分析 提…

C++字符串转base64编码

上一篇博客中分享的案例里面base64编码的工具函数单独拿出来分享一下&#xff0c;为不想自己写的大佬提供快捷的CV路径 const std::string base64_chars "ABCDEFGHIJKLMNOPQRSTUVWXYZ""abcdefghijklmnopqrstuvwxyz""0123456789/";std::string ba…

java如何通过循环计算阶乘

比如说要计算5的阶乘 先定义一个变量a5 再定义一个变量b1 通过一个循环 b*a a-- 示例代码如下 public class HelloWorld { public static void main(String[] args) { int a5; int b1; do { b*a; a--; } while(a>0); System.out.println(b); } }

openAI项目

文章目录 为什么单独提供chatgpt-sdk&#xff1f; 分而治之&#xff0c;不同的模块修改&#xff0c;不会影响到整体的变动。比如就只是 sdk 调整&#xff0c;或者再引入新的 sdk 都会非常容易管理。资源问题&#xff0c;如果公司内有多个系统都需要用到这个 sdk&#xff0c;那么…

A6500-LC LVDT 前置器,用于A6500-UM, 导轨安装

电源 22.5V to 32VDC <30mA <0.1%/V <60V( 使用SELV/PELV 供电电源) 约2.2Vrms,5kHz IP20 IEC 60529 -35C to 75C(-31F to 167F) -35C to 85C(-31F to 185F) 电流损耗 供电电压对 运行温度 存储温度 0.35mm(0.014 in ),10 to 55Hz 15g 根据 EN 60068-2-27 根据IEC 613…

北邮21硕后端开发笔记

blog 整理北邮21渣硕Java后端开发知识网络&#xff0c;阅读笔记以及技术博客&#xff0c;持续更新&#xff01;欢迎Star&#xff01; GitHub: https://github.com/WeiXiao-Hyy/blog Java 基础篇 一文带你搞懂final关键字 Java并发编程 fucking-java-concurrency解读 CS…