av手机免费在线观看,国产女人在线视频,国产xxxx免费,捆绑调教一二三区,97影院最新理论片,色之久久综合,国产精品日韩欧美一区二区三区

java語(yǔ)言

Java如何創(chuàng)建不可變類

時(shí)間:2025-03-15 23:58:43 java語(yǔ)言 我要投稿
  • 相關(guān)推薦

Java如何創(chuàng)建不可變類

  大家知道Java如何創(chuàng)建不可變類嗎?下面小編為大家解答一下,希望能幫到大家!

  class:java中class確切的表示為一個(gè)類

  object:java中object確切的表示為一個(gè)對(duì)象,也稱為類的實(shí)例

  其實(shí),如果一個(gè)類被設(shè)計(jì)成不可變的類,那么這個(gè)類的實(shí)例化對(duì)象也是不可變的。

  不可變類:當(dāng)你獲得這個(gè)類的一個(gè)實(shí)例引用時(shí),你不可以改變這個(gè)實(shí)例的內(nèi)容。

  那么,什么是不可變對(duì)象?

  一旦一個(gè)類的實(shí)例化對(duì)象被創(chuàng)建并初始化,那么它就不可以被改變。我們可以調(diào)用訪問(wèn)器方法(getter),復(fù)制對(duì)象,或者傳遞對(duì)象,但是不允許任何方法改變這個(gè)對(duì)象的狀態(tài)。包裝類(e.g.Integer或Float)和String類是不可變類的代表。

  訪問(wèn)器方法(accessor method):對(duì)成員變量做出訪問(wèn)的方法,e.g.getter()方法。

  修改器方法(mutator method):對(duì)成員變量做出修改的方法,e.g.setter()方法。

  定義一個(gè)不可變類

  如果我們要自己創(chuàng)建一個(gè)不可變類,需要遵守下面的規(guī)則:

  將成員變量(field:在一些書(shū)中也翻譯為域)聲明成final并在構(gòu)造器中初始化。

  對(duì)于基本類型的成員變量,用final修飾,一旦它被初始化,就不能被改變了。而對(duì)于引用類型的成員變量,不能夠改變它的引用。

  成員變量如果被聲明稱final,那么構(gòu)建對(duì)象時(shí),必須要初始化這樣的域

  引用類型是可變的,我們需要采取一些措施來(lái)保證它的不可變性。

  為什么?如果我們只是聲明了一個(gè)final的可變引用類型,那么這個(gè)引用可以去引用外部的類,或者被其他外部類引用。在這種情況下,我們要做到:

  1.這些方法不會(huì)改變這些可變對(duì)象中的內(nèi)容

  2.不要將這些引用分享到外部供其他類使用,例如,如果對(duì)成員變量的引用是可以被其他類改變的,那么這些外部類就可以改變這個(gè)類中的內(nèi)容。

  3.如果必須要返回一個(gè)引用,那么就返回一個(gè)對(duì)象的深度拷貝,這樣盡管返回的對(duì)象內(nèi)容改變了,但也保存著原始的內(nèi)容。

  只提供訪問(wèn)器方法(i.e. getter方法)不提供修改器方法(i.e.setter方法)

  如果一定要改變這個(gè)對(duì)象的內(nèi)容,那就創(chuàng)建一個(gè)新的不可變對(duì)象內(nèi)容做相應(yīng)的修改,返回修改后的對(duì)象的引用聲明類是final的。如果一個(gè)類可以被繼承,那么它子類就可以重載它的方法,并且修改成員變量

  Java API中不可變類的例子

  讓我們來(lái)回顧一下String類,用它來(lái)理解上述的幾個(gè)方面在String類實(shí)現(xiàn)中的體現(xiàn):

  所有在Stirng類中成員變量都被聲明成private,這些成員變量都在構(gòu)造器中在構(gòu)建對(duì)象時(shí)被初始化。

  trim concat substring 都可以改變String的對(duì)象,為了保證String的不可變性,這些方法都返回的是一個(gè)改變相應(yīng)內(nèi)容后新的對(duì)象。

  string類被聲明稱final,所以任何類都不能繼承,重載它的方法。

  自己實(shí)現(xiàn)一個(gè)不可變類

  接下來(lái)我們自己實(shí)現(xiàn)一個(gè)不可變類ImmutableCircle。

  //ImmutableCircle.java

  // Point is a mutable class

  class Point {

  private int xPos, yPos;

  public Point(int x, int y) {

  xPos = x;

  yPos = y;

  }

  public String toString() {

  return "x = " + xPos + ", y = " + yPos;

  }

  int getX() { return xPos; }

  int getY() { return yPos; }

  }

  // ImmutableCircle is an immutable class – the state of its objects

  // cannot be modified once the object is created

  public final class ImmutableCircle {

  private final Point center;

  private final int radius;

  public ImmutableCircle(int x, int y, int r) {

  center = new Point(x, y);

  radius = r;

  }

  public String toString() {

  return "center: " + center + " and radius = " + radius;

  }

  public int getRadius() {

  return radius;

  }

  public Point getCenter() {

  // return a copy of the object to avoid

  // the value of center changed from code outside the class

  return new Point(center.getX(), center.getY());

  }

  public static void main(String []s) {

  System.out.println(new ImmutableCircle(10, 10, 20));

  }

  // other members are elided ...

  }

  上面的程序運(yùn)行之后,打。

  center: x = 10, y = 10 and radius = 20

  上面的程序體現(xiàn)了不可變類的以下幾點(diǎn):

  · 這個(gè)類被聲明成final,不可以被繼承,也不可以重載它的方法

  · 這個(gè)類的成員變量都是final并且是私有的

  · 因?yàn)槌蓡T變量center是一個(gè)引用類型,是可變的,所以在他的getter方法中,返回的是對(duì)point對(duì)象的拷貝

  設(shè)計(jì)一個(gè)不可變的類最關(guān)鍵的一點(diǎn):

  要注意引用類型的成員變量,如果成員變量的類型是可變的引用類型,就必須要采取必要的措施來(lái)保護(hù)這個(gè)成員變量不會(huì)被修改

  不可變類不足的地方

  不可變對(duì)象同樣也有不足的地方。為了保證不可變性,不可變類中的方法會(huì)創(chuàng)建出一定量的對(duì)象的拷貝。例如,在上面的代碼中,每次調(diào)用getcenter方法都會(huì)新建并返回一個(gè)point對(duì)象的拷貝。而假如我們只需要調(diào)用一次,返回一個(gè)point對(duì)象,就沒(méi)必要費(fèi)盡心神的去設(shè)計(jì)一個(gè)不可變類,僅僅只需要一個(gè)可變的immutablecircle類就可以了。

  String類在很多應(yīng)用場(chǎng)景中都會(huì)用到,如果我們調(diào)用String類中trim,concat,或者是在循環(huán)中調(diào)用substring方法,都會(huì)創(chuàng)建一個(gè)新的臨時(shí)String對(duì)象。同時(shí),java也提供了Stringbuffer和Stringbuilder的可變類。他們同String一樣,但是卻可以改變這個(gè)對(duì)象的內(nèi)容。所以,我們可以根據(jù)不同的場(chǎng)景使用String類或者Stringbuffer/Stringbuilder類。

【Java如何創(chuàng)建不可變類】相關(guān)文章:

如何創(chuàng)建java包06-11

Java不可變類型的詳解06-05

如何創(chuàng)建并運(yùn)行Java線程01-11

如何創(chuàng)建java包名06-09

如何創(chuàng)建并運(yùn)行Java線03-19

java Runnable接口如何創(chuàng)建線程05-18

Java中的String為什么是不可變的07-10

Java的類07-19

如何編寫一個(gè)JAVA的隊(duì)列類03-07