国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

java基礎提高篇——對象的創建

2019-11-15 00:15:34
字體:
來源:轉載
供稿:網友
java基礎提高篇——對象的創建

我一直使用構造器的方式生成或者初始化對象。最近發現一些對象在項目中并沒有實際作用,有時我只是需要它的一些功能,為此新建一個對象是不是比較消耗資源,影響程序的性能呢。今天看到一些資料,對這個問題作出了一個回答。

說明:

首先肯定的是,我們有時候并不需要一個類的全部功能,或許我們需要的只是其中的一兩個方法,沒必要為此新建一個類。靜態方法解決了這個問題。靜態方法應該成為每個面向對象設計程序者必修課程。首先我們學習靜態方法創建對象。

使用靜態工廠的方式產生對象的好處有這樣幾個好處:“一:靜態方法都有名字,使得你更明白自己在干什么”;“二:使用靜態方法不必在每次創建對象,節省了內存”;“三:更靈活,可以返回原返回類型的任何子類型的對象”“四:代碼看起來更簡潔”;當然它也有缺點的,其中一個主要的缺點是,如果使用靜態方法產生對象,那么似乎就可以不包含公有或者受保護的構造器,這樣的話子類想繼承的話就是不可能的事了。這個可以通過復合避開繼承來解決這個問題。

下面將介紹幾個比較著名的靜態構造器的例子。

第一個例子:多參數類

考慮這個一個需求,我需要建一個類。這個類是用來描述商品的產品說明的,那么這個類就會有很多的參數,并且在每個對象對這個類中的參數需求都是不同的。如果使用重疊構造器,你需要寫很多的構造器,最多需要2的n次方個構造器。當然我不會這樣寫,我會使用javaBeans模式生成get、set方式。這種方式有缺點,老實說以我現在還看不到這樣寫的危害,似乎是在多線程中是不安全的。這里還是推薦給大家一個更安全更完善的構造方法:

使用builder模式來生成對象。大概的想法是這樣的:在這種多參數類的內部構建一個builder的內部類,使用內部類接收傳參,最后才是更新外部類的參數。這樣做的好處可以是事前檢測數據的合法性,對于不合法的數據可以事先處理掉,保證了數據的安全性。這里給出一個例子(要編寫以及使用這樣的類,你需要知道內部類的語法),

public class BuiltTest {    PRivate String name1, name2, name3, name4, name5, name6, name7;        /*     * 內部類builder     */    public static class Built {        private String name1, name2, name3, name4, name5, name6, name7;        public Built setname1(String name1) {            this.name1 = name1;            return this;        }        public Built setname2(String name2) {            this.name2 = name2;            return this;        }        public Built setname3(String name3) {            this.name3 = name3;            return this;        }        public Built setname4(String name4) {            this.name4 = name4;            return this;        }        public Built setname5(String name5) {            this.name5 = name5;            return this;        }        public Built setname6(String name6) {            this.name6 = name6;            return this;        }        public Built setname7(String name7) {            this.name7 = name7;            return this;        }        public BuiltTest built() {            return new BuiltTest(this);        }    }        //構造方法    private BuiltTest(Built built) {        this.name1 = built.name1;        this.name2 = built.name2;        this.name3 = built.name3;        this.name4 = built.name4;        this.name5 = built.name5;        this.name6 = built.name6;        this.name7 = built.name7;    }        //重寫toSting方法    @Override    public String toString() {        String str="My name is "+name1+","+name2+","+name3+","+name4+","+name5+","+name6+","+name7;        return str;    }}

調用的代碼:

//創建一個BuiltTest對象BuiltTest a=new BuiltTest.Built().setname1("xiaohua").setname2("小小").setname3("安徽").built();

這種builder方法建立起來的對象,經過測試在參數大于等于4時,性能是更優的。考慮到程序的擴展性,最好一開始就使用builder的構造器。

第二個例子:強化Singleton屬性

在一些程序中,為了數據安全,我們僅需要一個對象,這時我們需要Singleton模式。Singleton有三種寫法,第一種定義一個Singleton的常量,第二種方法使用工廠的方式返回一個Singleton的對象,第三種方式是返回一個枚舉類型的對象。

//第一種方式,產生一個final的對象,私有化構造方法public class Elvis {    public static final Elvis INSTANC_ELVIS = new Elvis();    private Elvis() {    }}
//第二章方法,又構造器產生一個Singleton的對象public class Elvis {    private  static final Elvis INSTANC_ELVIS = new Elvis();    private Elvis() {    }        public Elvis getElvis(){        return INSTANC_ELVIS;    }}
//第三種方法,編寫一個enum 類public enum Elvis {    INSTANC_ELVIS;    }

這里簡單介紹一下枚舉類:枚舉類型是java5.0之后開始推出的。考慮這樣一種需求,我想設計一個類,它的對象是可數的,并且我想讓它的每個對象都唯一的,我還想它的每個對象時不可變的。打個比方說這個類就是,星期week,我該怎么設計呢?

可以使用static final關鍵字:

package eum;public class week1 {    //定義類成員    public static final week1 MONDAY = new week1(1);    public static final week1 TUESDAY = new week1(2);    public static final week1 WENTHDAY = new week1(3);        private int i;    private  week1(int i) {        this.i=i;    }}

在java1.5之后你可以使用枚舉類型:

public enum week2{        //枚舉類型的實例        MONDAY,TUESDAY,WENTHDAY;    }

枚舉類型的實例在第一次使用的時候被實例化。

枚舉類是一種特殊的類,我們在編譯時會產生class文件。繼承于java.lang.Enum類。定義的時候寫出我們需要實例化的對象名稱,之后就是寫類的定義代碼。為了保證數據的唯一性,枚舉不能被繼承。在實例化時候需要使用Enum.valueOf()方法來實例化對象,一個完整的枚舉類型的例子如下:

public class TestEnum {    public enum TestE {        MALE,FEMALE;        public String name;    }    public static void main(String[] args) {        TestE gg1=Enum.valueOf(TestE.class, "MALE");        gg1.name="男";        System.out.println("我是"+gg1+"代表"+gg1.name);                TestE gg2=Enum.valueOf(TestE.class, "MALE");        gg2.name="男主角";        System.out.println("我是"+gg2+"代表"+gg2.name);                        System.out.println("gg1==gg2:"+(gg1.equals(gg2)));        System.out.println("gg1.name==gg2.name:"+(gg1.name==gg2.name));    }}打印的結果是:我是MALE代表男我是MALE代表男主角gg1==gg2:truegg1.name==gg2.name:true

比起我們自己定義的,枚舉類有許多好處,一句話,是前輩們設計出來的,確保了每個實例只有一個;而我們自己設計第一種類是有缺陷的,比如序列化的問題。

對于單例模式,可以使用枚舉類的設計保護類的安全。

第三個例子:對于不需要實例化的類,私有化其構造器

在一個項目中,我們常常建立一個包專門存放工具類的。比如在Java EE開發中,我們常常需要操作數據庫,我們會專門建立一個until包,存放操作數據庫的工具,這些類在使用到的時候并不需要實例化多占據計算機資源。此時我們選擇定義所有的方法和成員都是靜態的。這時可以將類的構造方法私有化,防止其他的使用者濫用。

第四個例子:避免不必要的創建對象

創建多余的對象時很浪費操作時間的,在for循環中會成百倍的浪費系統的時間。因此盡量使用靜態方法代替構造器的方法使用方法。對于String常量,有兩種定義方式:

String s1=new String("String1");String s1="String1";

盡量使用后面一種定義方式,前者創建了兩個對象,后者經創建了一個對象,而且是字符串常量。

Java提供了自動裝包的機制,在使用時,需要注意,有時候我們沒意識就使用了裝包,而創建了大量沒有用處的類。

Long s=0L;for(int i=0;i<100;i++){s+=i;}

這段代碼,由于自動裝包,創建了很多沒有實際用處的Long實例。

第五個例子:比較晦澀,垃圾回收,清除Java不要的對象

簡單的說是這樣的,java垃圾回收是自動的,非常的方便。但是有個需要注意的地方,就是過期應用的情況,它可能造成內存泄露。事情的原因是一個對象只要還有一個引用,那么垃圾回收器就不會回收這個對象。在我們自己設計的堆中,可能先增長,后縮短,如果我們不手動,把那些增長后的有縮短了的,我們不需要的,“對象引用”設置成空的話,這些對象會一直被存在。影響性能。

在我們自己設計內存管理的時候,就是牽扯到引用對象數組的時候需要注意到這個問題。

當然集合已經很好的解決了這個問題。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 鱼台县| 福海县| 华坪县| 大英县| 信丰县| 盐津县| 南安市| 喀什市| 台南市| 兴隆县| 祁东县| 筠连县| 白水县| 报价| 林甸县| 甘南县| 张家界市| 曲周县| 清涧县| 定远县| 连江县| 庄浪县| 吉水县| 皋兰县| 元氏县| 凤阳县| 盐山县| 论坛| 宽甸| 漳平市| 中方县| 璧山县| 子洲县| 天峨县| 绥江县| 海林市| 苍溪县| 南投县| 图们市| 肥城市| 泰州市|