最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文總結(jié)使用Java創(chuàng)建對象的八種方式

 更新時(shí)間:2026年01月06日 08:22:06   作者:程序員大華  
這篇文章主要介紹了8種創(chuàng)建對象的方法,包括new關(guān)鍵字、反射機(jī)制、clone()方法、反序列化、靜態(tài)工廠方法、Builder模式、匿名內(nèi)部類和方法引用,每種方法都有其適用場景和優(yōu)缺點(diǎn),需要的朋友可以參考下

昨晚加班的時(shí)候,同事來旁邊坐著跟我閑聊,不經(jīng)意間看到屏幕上的new 對象代碼,他說:“每次這樣new 一個(gè)對象感覺好丑,有沒有更好的方式方法!”。

我說:“有啊,不過也得看場景,簡單的直接用 new 一把梭哈!復(fù)雜的再考慮其它的方式”

那有哪些方式呢?下面來分享一下。

1. new關(guān)鍵字

最直接的創(chuàng)建方式

// 就像我們平時(shí)說話:"來一輛新車"
Car car = new Car();

// 或者帶參數(shù)的:"來一輛紅色的寶馬"
Car bmw = new Car("寶馬", "紅色");

使用場景:這是最常用的方式,適合90%的日常開發(fā)場景。

優(yōu)點(diǎn)

  • 簡單直觀,一眼就能看懂
  • 性能好,直接調(diào)用構(gòu)造方法

缺點(diǎn)

  • 不夠靈活,創(chuàng)建邏輯與使用代碼耦合

2. 反射機(jī)制

有時(shí)候我們需要在運(yùn)行時(shí)才知道要創(chuàng)建什么類的對象,這時(shí)候反射就派上用場了。

// 傳統(tǒng)方式:我知道要創(chuàng)建Car
Car car = new Car();

// 反射方式:運(yùn)行時(shí)才知道要創(chuàng)建什么
try {
    Class carClass = Class.forName("com.example.Car");
    Constructor constructor = carClass.getConstructor();
    Car car = (Car) constructor.newInstance();
} catch (Exception e) {
    e.printStackTrace();
}

案例:Spring框架中,當(dāng)我們配置了@Component注解的類,Spring就是通過反射來創(chuàng)建這些對象的。

// Spring內(nèi)部大致是這樣做的
Class beanClass = loadClass("com.example.UserService");
Object bean = beanClass.getDeclaredConstructor().newInstance();

3. clone()方法

假設(shè)你有一個(gè)配置好的對象,現(xiàn)在需要另一個(gè)一模一樣的,這時(shí)候clone就很有用。

class UserSettings implements Cloneable {
    private String theme = "dark";
    private int fontSize = 14;
    
    @Override
    public UserSettings clone() {
        try {
            return (UserSettings) super.clone();
        } catch (CloneNotSupportedException e) {
            throw new AssertionError();
        }
    }
}

// 使用clone
UserSettings original = new UserSettings();
UserSettings cloned = original.clone(); // 得到一個(gè)完全相同的副本

注意點(diǎn)

  • 需要實(shí)現(xiàn)Cloneable接口,否則會拋出異常
  • 默認(rèn)是淺拷貝,如果需要深拷貝要自己實(shí)現(xiàn)

4. 反序列化

當(dāng)我們把對象保存到文件或通過網(wǎng)絡(luò)傳輸后,需要重新把它變回對象。

// 對象需要實(shí)現(xiàn)Serializable接口
class GameSave implements Serializable {
    private static final long serialVersionUID = 1L;
    private int level;
    private int score;
}

// 保存對象到文件
try (ObjectOutputStream oos = new ObjectOutputStream(
        new FileOutputStream("save.dat"))) {
    oos.writeObject(gameSave);
}

// 從文件讀取對象
try (ObjectInputStream ois = new ObjectInputStream(
        new FileInputStream("save.dat"))) {
    GameSave loadedSave = (GameSave) ois.readObject();
    // loadedSave就是原來那個(gè)gameSave的副本
}

5. 靜態(tài)工廠方法

有時(shí)候直接new不夠表達(dá)我們的意圖,這時(shí)候工廠方法就很有用。

class Color {
    private int red, green, blue;
    
    private Color(int r, int g, int b) {
        this.red = r;
        this.green = g;
        this.blue = b;
    }
    
    // 靜態(tài)工廠方法:語義更明確
    public static Color fromRGB(int r, int g, int b) {
        return new Color(r, g, b);
    }
    
    public static Color fromHex(String hex) {
        // 解析十六進(jìn)制顏色碼
        return new Color(/* 解析邏輯 */);
    }
    
    public static Color red() {
        return new Color(255, 0, 0);
    }
}

// 使用:這樣讀起來更自然
Color red = Color.red();
Color custom = Color.fromRGB(255, 128, 0);

優(yōu)點(diǎn)

  • 方法名可以表達(dá)創(chuàng)建意圖
  • 可以緩存對象,避免重復(fù)創(chuàng)建
  • 可以返回子類對象,更靈活

6. Builder模式

當(dāng)對象有很多屬性時(shí),構(gòu)造方法會變得很長很難讀,Builder模式來解決!

class Computer {
    private final String cpu;          // 必須
    private final String ram;          // 必須  
    private final String storage;      // 必須
    private final String graphicsCard; // 可選
    private final String monitor;      // 可選
    
    // 私有構(gòu)造方法,只能通過Builder創(chuàng)建
    private Computer(Builder builder) {
        this.cpu = builder.cpu;
        this.ram = builder.ram;
        this.storage = builder.storage;
        this.graphicsCard = builder.graphicsCard;
        this.monitor = builder.monitor;
    }
    
    public static class Builder {
        // 必須參數(shù)
        private final String cpu;
        private final String ram;
        private final String storage;
        
        // 可選參數(shù)
        private String graphicsCard = "集成顯卡";
        private String monitor = "23寸顯示器";
        
        // Builder構(gòu)造方法包含必須參數(shù)
        public Builder(String cpu, String ram, String storage) {
            this.cpu = cpu;
            this.ram = ram;
            this.storage = storage;
        }
        
        // 設(shè)置可選參數(shù)的方法
        public Builder graphicsCard(String graphicsCard) {
            this.graphicsCard = graphicsCard;
            return this;
        }
        
        public Builder monitor(String monitor) {
            this.monitor = monitor;
            return this;
        }
        
        public Computer build() {
            return new Computer(this);
        }
    }
}

// 使用Builder模式:鏈?zhǔn)秸{(diào)用,非常清晰
Computer gamingPC = new Computer.Builder("i7", "16GB", "1TB SSD")
    .graphicsCard("RTX 3080")
    .monitor("27寸4K顯示器")
    .build();

適用場景

  • 對象有很多屬性,特別是可選屬性很多時(shí)
  • 希望創(chuàng)建過程更清晰、易讀
  • 需要創(chuàng)建不可變對象

7. 匿名內(nèi)部類

當(dāng)我們只需要某個(gè)接口的一次性實(shí)現(xiàn)時(shí),匿名內(nèi)部類很方便。

// 創(chuàng)建線程的傳統(tǒng)方式
class MyTask implements Runnable {
    @Override
    public void run() {
        System.out.println("執(zhí)行任務(wù)");
    }
}

Runnable task1 = new MyTask();

// 使用匿名內(nèi)部類:更簡潔
Runnable task2 = new Runnable() {
    @Override
    public void run() {
        System.out.println("執(zhí)行任務(wù)");
    }
};

// Java 8以后,可以用lambda表達(dá)式進(jìn)一步簡化
Runnable task3 = () -> System.out.println("執(zhí)行任務(wù)");

8. 方法引用

Java 8引入了函數(shù)式編程,讓對象創(chuàng)建更加優(yōu)雅。

class Person {
    private String name;
    
    public Person() {
        this.name = "匿名";
    }
    
    public Person(String name) {
        this.name = name;
    }
}

// 方法引用創(chuàng)建對象
Supplier defaultPerson = Person::new;
Function namedPerson = Person::new;

// 使用
Person p1 = defaultPerson.get();      // 調(diào)用無參構(gòu)造
Person p2 = namedPerson.apply("張三"); // 調(diào)用有參構(gòu)造

總結(jié)

場景推薦方式理由
日常開發(fā)new關(guān)鍵字簡單直接,性能好
多參數(shù)對象Builder模式可讀性好,靈活
需要封裝創(chuàng)建邏輯靜態(tài)工廠方法隱藏實(shí)現(xiàn)細(xì)節(jié)
框架開發(fā)反射機(jī)制動態(tài)性,靈活性
函數(shù)式編程方法引用代碼簡潔,表達(dá)力強(qiáng)
創(chuàng)建對象副本clone()方法語義明確,使用方便

簡單場景用new,復(fù)雜對象用Builder,需要靈活性用工廠方法或反射。

到此這篇關(guān)于使用Java創(chuàng)建對象的八種方式的文章就介紹到這了,更多相關(guān)Java創(chuàng)建對象方式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Mybatis-Plus insertBatch執(zhí)行緩慢的原因查詢

    Mybatis-Plus insertBatch執(zhí)行緩慢的原因查詢

    這篇文章主要介紹了Mybatis-Plus insertBatch執(zhí)行緩慢的原因查詢,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Java接入常用大模型API的實(shí)戰(zhàn)對比

    Java接入常用大模型API的實(shí)戰(zhàn)對比

    這篇文章主要為大家詳細(xì)介紹了Java接入常用大模型API的實(shí)戰(zhàn)對比,主要是Ollama(本地),阿里云通義千問,OpenAI和豆包 Coze,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下
    2026-04-04
  • Java中的對象和引用詳解

    Java中的對象和引用詳解

    這篇文章主要介紹了Java中的對象和引用詳解的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • 如何解決java.lang.ClassNotFoundException: com.mysql.jdbc.Driver問題

    如何解決java.lang.ClassNotFoundException: com.mysql.jdbc.Dr

    這篇文章主要介紹了如何解決java.lang.ClassNotFoundException: com.mysql.jdbc.Driver問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • 數(shù)據(jù)庫CURD必備搭檔mybatis?plus詳解

    數(shù)據(jù)庫CURD必備搭檔mybatis?plus詳解

    這篇文章主要為大家介紹了數(shù)據(jù)庫CURD必備搭檔mybatis?plus詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • spring scheduled單線程和多線程使用過程中的大坑

    spring scheduled單線程和多線程使用過程中的大坑

    本文主要介紹了spring scheduled單線程和多線程使用過程中的大坑,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Spring AOP高級應(yīng)用與源碼剖析

    Spring AOP高級應(yīng)用與源碼剖析

    Spring AOP通過動態(tài)代理,在不修改原有業(yè)務(wù)邏輯的情況下增強(qiáng)橫切邏輯,如權(quán)限校驗(yàn)、日志記錄、事務(wù)控制和性能監(jiān)測,本文介紹Spring AOP高級應(yīng)用與源碼剖析,感興趣的朋友跟隨小編一起看看吧
    2025-12-12
  • JavaWeb讀取配置文件的四種方法

    JavaWeb讀取配置文件的四種方法

    這篇文章主要介紹了JavaWeb讀取配置文件的4種方法,方法一采用ServletContext讀取,方法二采用ResourceBundle類讀取配置信息,方法三采用ClassLoader方式進(jìn)行讀取配置信息,對javaweb讀取配置文件的四種方法感興趣的朋友參考下吧
    2018-03-03
  • spring-shiro權(quán)限控制realm實(shí)戰(zhàn)教程

    spring-shiro權(quán)限控制realm實(shí)戰(zhàn)教程

    這篇文章主要介紹了spring-shiro權(quán)限控制realm實(shí)戰(zhàn)教程,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • mybatis動態(tài)SQL常用的標(biāo)簽使用及說明

    mybatis動態(tài)SQL常用的標(biāo)簽使用及說明

    文章主要講解了MyBatis中的動態(tài)SQL標(biāo)簽,包括使用場景、作用和示例,主要介紹了<where>、<choose>、&<set>、&<foreach>、&&<bind>等等、標(biāo)簽的的用用使用方法和作用,以及<sql>片段的概念和引用方式
    2026-04-04

最新評論

西充县| 阿瓦提县| 天峨县| 铁力市| 那坡县| 大安市| 锦州市| 岳西县| 新宁县| 永春县| 固镇县| 巴塘县| 比如县| 遵化市| 小金县| 萝北县| 台东市| 铜川市| 龙口市| 宣恩县| 乌海市| 延庆县| 老河口市| 新野县| 霞浦县| 曲水县| 安多县| 迁西县| 运城市| 柞水县| 兴安盟| 留坝县| 连州市| 阜阳市| 枣庄市| 瓮安县| 庄河市| 维西| 汤阴县| 儋州市| 临沧市|