如何创建优雅的对象

在Java中,优雅地创建对象可以通过几种方式来实现。以下是一些常用的优雅创建对象的方法:

使用构造方法:

最常见的创建对象的方式是使用类的构造方法。在Java中,每个类都有一个默认的无参构造方法,如果没有显式定义构造方法,编译器会自动添加默认构造方法。可以通过调用类的构造方法来创建对象,例如:MyClass obj = new MyClass();如果类提供了其他参数的构造方法,也可以根据需要选择合适的构造方法进行对象的创建。

使用静态工厂方法:

静态工厂方法是一种创建对象的替代方式,它是在类中定义一个静态方法,用于创建和返回对象实例。静态工厂方法可以有自定义的名称,使代码更具可读性。例如:

public class MyClass {private MyClass() {}public static MyClass createInstance() {return new MyClass();}
}

然后,可以使用静态工厂方法来创建对象:MyClass obj = MyClass.createInstance();

使用Builder模式:

Builder模式是一种创建复杂对象的优雅方式。通过Builder模式,可以将对象的构建过程分解为多个步骤,并在每个步骤中设置对象的属性,最后由Builder实例返回完整的对象。这样可以避免使用过长的构造函数或多个构造函数的情况,使代码更加清晰和可维护。
定义Person类

package com.lfsun.main.basic.myobject;import com.lfsun.common.util.ToString;public class Person {private String name;private int age;private String gender;private String address;private Person(Builder builder) {this.name = builder.name;this.age = builder.age;this.gender = builder.gender;this.address = builder.address;}// Getters for Person's attributespublic static class Builder {private String name;private int age;private String gender;private String address;public Builder() {// Set default values if needed}public Builder setName(String name) {this.name = name;return this;}public Builder setAge(int age) {this.age = age;return this;}public Builder setGender(String gender) {this.gender = gender;return this;}public Builder setAddress(String address) {this.address = address;return this;}public Person build() {// Perform any validation if neededreturn new Person(this);}@Overridepublic String toString() {return "Builder{" +"name='" + name + '\'' +", age=" + age +", gender='" + gender + '\'' +", address='" + address + '\'' +'}';}}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +", gender='" + gender + '\'' +", address='" + address + '\'' +'}';}
}

使用:

package com.lfsun.main.basic.myobject;public class MyBuilderExample {public static void main(String[] args) {Person person = new Person.Builder().setName("lfsun").setAge(11).setGender("Male").setAddress("123 Main St").build();// Use the person objectSystem.out.println(person.toString());}
}

使用工厂模式:

工厂模式是一种创建对象的设计模式,它将对象的创建过程封装在一个工厂类中,客户端只需要通过工厂类获取对象,而不需要关心具体的对象创建过程。这样可以降低类之间的耦合度,并提供更灵活的对象创建方式。

假设有一个简单的形状接口 Shape 和两个具体形状类 Circle 和 Rectangle,并且希望使用工厂模式创建这些形状的对象。

定义形状接口和具体形状类:

// Shape接口
public interface Shape {void draw();
}// Circle类
public class Circle implements Shape {@Overridepublic void draw() {System.out.println("Inside Circle::draw() method.");}
}// Rectangle类
public class Rectangle implements Shape {@Overridepublic void draw() {System.out.println("Inside Rectangle::draw() method.");}
}

定义抽象工厂接口:

public interface ShapeFactory {Shape createShape();
}

实现具体工厂类:

// Circle工厂
public class CircleFactory implements ShapeFactory {@Overridepublic Shape createShape() {return new Circle();}
}// Rectangle工厂
public class RectangleFactory implements ShapeFactory {@Overridepublic Shape createShape() {return new Rectangle();}
}

在客户端中使用工厂创建对象:

public class Client {public static void main(String[] args) {// 使用Circle工厂创建Circle对象ShapeFactory circleFactory = new CircleFactory();Shape circle = circleFactory.createShape();circle.draw(); // 输出:Inside Circle::draw() method.// 使用Rectangle工厂创建Rectangle对象ShapeFactory rectangleFactory = new RectangleFactory();Shape rectangle = rectangleFactory.createShape();rectangle.draw(); // 输出:Inside Rectangle::draw() method.}
}

在上述示例中,定义了一个 Shape 接口和两个具体形状类 Circle 和 Rectangle,它们都实现了 Shape 接口。然后,定义了一个抽象工厂接口 ShapeFactory,它有一个 createShape() 方法来创建形状对象。接着,分别实现了 CircleFactory 和 RectangleFactory,它们分别用于创建 Circle 和 Rectangle 的对象。

在客户端中,通过具体工厂类来创建具体的形状对象,客户端代码不需要知道具体的对象创建过程,只需要与抽象工厂接口 ShapeFactory 进行交互即可。这样,实现了工厂模式,将对象的创建过程封装在工厂类中,从而提供了更灵活的对象创建方式,并降低了客户端代码与具体类的耦合度。

使用反射:

虽然反射可能会带来性能开销,并且降低代码的可读性,但在某些情况下,反射也可以作为一种优雅创建对象的方式。通过反射,可以在运行时动态地创建对象和调用构造方法,实现更灵活的对象创建。

package com.lfsun.main.basic.myobject.createobj.byreflect;import java.lang.reflect.Constructor;public class MyReflectionCreateObjExample {public static void main(String[] args) {try {// 获取类的Class对象Class<?> myClass = MyClass.class;// 获取指定的构造方法Constructor<?> constructor = myClass.getConstructor(String.class, int.class);// 动态创建对象Object myObject = constructor.newInstance("lfsun", 11);// 转换为实际的类类型MyClass myInstance = (MyClass) myObject;// 使用创建的对象myInstance.sayHello(); // 输出:Hello, I'm lfsun. I'm 11 years old.} catch (Exception e) {e.printStackTrace();}}
}// 示例类
class MyClass {private String name;private int age;public MyClass(String name, int age) {this.name = name;this.age = age;}public void sayHello() {System.out.println("Hello, I'm " + name + ". I'm " + age + " years old.");}
}

在选择创建对象的方式时,应根据具体情况来考虑,权衡优势和劣势。使用构造方法是最常见和简单的方式,而静态工厂方法、Builder模式和工厂模式可以提供更多的灵活性和可读性。反射作为一种动态创建对象的方式,应在性能敏感的场景中谨慎使用。

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

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

相关文章

人工智能如何应对 DevOps 监控和可观测性挑战

自 ChatGPT 横空出世之后&#xff0c;AIGC 已成为不可逆转的时代浪潮。在之前的文章中&#xff0c;我们介绍了DevOps 领域中AI的用例&#xff0c;需要回顾可以点击下方链接。在本篇文章中&#xff0c;我将简单聊聊人工智能&#xff08;AI&#xff09;如何通过分析日志和指标来预…

基于Matlab实现图像融合技术(附上多个仿真源码+数据)

图像融合技术是一种将多幅图像融合为一幅图像的方法&#xff0c;使得这幅融合图像包含原始图像的所有信息。近年来&#xff0c;图像融合技术已经广泛应用于图像分割、变换和裁剪等领域。本文将介绍如何使用Matlab实现图像融合技术。 实现步骤 首先&#xff0c;我们需要了解图…

C#实现int类型和字节流的相互在转化

通过TCP协议进行数据传输时&#xff0c;需要将所有传输的内容转为字节流&#xff0c;这里就用到了将int型的数据转为字节流的。代码如下&#xff1a; public static byte[] BytesConvertToInt(int vel) {byte[] hex new byte[4];hex[3] (byte)(vel >> 24) & 0xff)…

【机器学习】Cost Function for Logistic Regression

Cost Function for Logistic Regression 1. 平方差能否用于逻辑回归&#xff1f;2. 逻辑损失函数loss3. 损失函数cost附录 导入所需的库 import numpy as np %matplotlib widget import matplotlib.pyplot as plt from plt_logistic_loss import plt_logistic_cost, plt_two_…

GD32F103VE睡眠与唤醒

GD32F103VE睡眠与唤醒&#xff0c;兆易官网给的程序没有测试。等测试后&#xff0c;才发现有问题。 现修改&#xff0c;测试如下&#xff1a; #include "SleepMode.h" #include "delay.h"u8 WFE_CMD_EnterSleepModeFlag;void Enter_DeepSleepMode(void);…

github国内镜像站点。解决assets转圈加载不出来的问题

github镜像站 https://hub.nuaa.cf/ https://gitclone.com/ 下载加速 https://gh.api.99988866.xyz/ https://ghproxy.com/ https://github.ur1.fun/ assets转圈加载不出来 f12打开开发者工具&#xff0c;根据前面的loadinglaze&#xff0c;找到这个网址 可以直接看到assets…

【使用 DSP 滤波器加速速度和位移】使用信号处理算法过滤加速度数据并将其转换为速度和位移研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【计算机网络】数据链路层

文章目录 1. 数据链路层1.1 数据链路层简介1.2 数据链路层做了什么 2. 以太网协议2.1 以太网2.2 以太网帧的格式2.3 MAC地址2.4 MTU 3. 数据跨网络传输的整体过程4. ARP协议4.1 认识ARP协议4.2 ARP协议的格式4.3 ARP协议的工作流程 1. 数据链路层 1.1 数据链路层简介 数据链路…

MySql之索引

MySql之索引 1.索引概述 MySql官方对索引的定义为&#xff1a;索引是帮助MySql高效获取数据的数据结构。在数据之外&#xff0c;数据库系统还维护着满足特定查找算法的数据结构&#xff0c;这些数据结构以某种方式引用数据&#xff0c;这样就可以在这些数据结构上实现高级查找…

xiaoweirobot.chat

目录 1 xiaoweirobot.chat 1.1 引用文件 1.2 HttpGetDataListener 1.2.1 // 语音云参数 xiaoweirobot.chat 引用文件package com.shrimp.xiaoweirobot.chat; import java.io.UnsupportedEncodingExcep

初识网络(JavaEE初阶系列9)

目录 前言&#xff1a; 1.网络的发展史 1.1独立模式 1.2网络互联 1.3局域网LAN 1.4广域网WAN 2.网络通信基础 2.1IP地址 2.2端口号 3.认识协议 3.1协议分层 3.2分层的作用 3.3TCP/IP五层&#xff08;或四层&#xff09;模型 3.4OSI七层模型 3.5网络设备所在分层 …

【JAVASE】继承

⭐ 作者&#xff1a;小胡_不糊涂 &#x1f331; 作者主页&#xff1a;小胡_不糊涂的个人主页 &#x1f4c0; 收录专栏&#xff1a;浅谈Java &#x1f496; 持续更文&#xff0c;关注博主少走弯路&#xff0c;谢谢大家支持 &#x1f496; 继承 1. 为什么要继承2. 继承概念3. 继承…

git仓库清理

关于git仓库的清理&#xff0c;主要就是清理git仓库里面的大的二进制文件。网上查了很多教程&#xff0c;很多都是用&#xff1a;git filter-branch.清理仓库中的大文件。 我尝试着本地测试了一下&#xff0c;发现是真慢呀。 方法一、git filter-branch step1&#xff1a;查…

Linux笔记1(系统状态等)

man命令&#xff1a; man name: man section name: man -k regexp: 在 Linux 中&#xff0c;man 命令用于查看命令、函数或配置文件等的手册页&#xff0c;提供了详细的帮助文档。man 是 "manual" 的缩写。man 命令的用法如下&#xff1a; man [选项] [命令名]例如&…

单元测试之- mock工具mockito

常用的mock工具mockito 在编写单元测试时&#xff0c;需要mock依赖的对象&#xff0c;减少依赖对象对测试的影响&#xff0c;Mocktio是常用的mock工具之一&#xff0c;那么mockito提供了哪些功能呢&#xff1f; Mock对象的创建和配置&#xff1a;Mockito可以通过简单的语法创建…

DBeaver:Excel表格数据导入mysql数据库表内

1、准备Excel数据&#xff0c;并另存为 csv文件&#xff0c;编码格式为utf-8 2、打开DBeaver&#xff0c;选中要添加的表&#xff0c;右键-导入数据 这个时候表已经提前创建好了&#xff0c;字段也是一一对应 3、导入数据 第二步选中要导入的csv数据 第三步看一下表的映射关系是…

Hive 安装介绍

介绍 Hive是基于Hadoop的一个数据仓库工具&#xff0c;可以将结构化的数据文件映射为一张数据库表&#xff0c;并提供类SQL查询功能。 其本质是将SQL转换为MapReduce的任务进行运算&#xff0c;底层由HDFS来提供数据的存储&#xff0c;说白了hive可以理解为一个将SQL转换为Ma…

4G WWAN设备类型

WWAN设备类型 USB dongle是设备接入互联网的重要方式之一&#xff0c;典型的通过USB接口与主设备连接&#xff0c;然后主设备通过4G/5G接入互联网&#xff0c;作为移动宽带设备&#xff0c;它有那些设备类型及暴露方式呢&#xff1f; 移动宽带设备类型&#xff1a;ModemManage…

Flutter 命名路由

我们可以通过创建一个新的Route&#xff0c;使用Navigator来导航到一个新的页面&#xff0c;但是如果在应用中很多地方都需要导航到同一个页面&#xff08;比如在开发中&#xff0c;首页、推荐、分类页都可能会跳到详情页&#xff09;&#xff0c;那么就会存在很多重复的代码。…

Pytest 重复执行用例插件----pytest-repeat

前言 在自动化过程中&#xff0c;想要重复执行一条脚本&#xff0c;查看他的稳定性&#xff0c;如果是在unittest框架中&#xff0c;可能会使用for一直循环这条用例&#xff0c;但是当我们使用pytest框架后&#xff0c;我们就可以通过某些插件来实现这个功能了。今天介绍的这个…