2013-01-10 31 views
1

在準備面試時,有人提到知道如何用java編寫一個類/方法read-only。我一直在做一些搜索,但還沒有找到真正具體的東西。只讀類/方法

也許這個問題比我更容易回答,但是什麼樣的方法可以使類或方法在java中只讀?

+2

能將它們說話關於['final'](http://www.javamex .COM/java_equivalents/const_java.shtml)? –

+3

你正在尋找的詞是「不可變的」 –

回答

-1

簡單的規則:沒有任何公共字段和沒有公共setter方法。

例如,參見下面的類:

final class AReadOnlyClass 
{ 
    private int anInt; 

    public int GetAnInt() 
    { 
     return anInt; 
    } 
} 
+0

final並不意味着只讀(除了原始類型)。最終變量引用的對象的值仍然可以更改。 – kosa

+0

是的,同意。但引用將始終指向同一個對象。在這個看法中,它是最終的。 – Azodious

+2

'final'與不變性無關。你的班級就是一個很好的例子,只需在你的答案中擺脫「最後」的東西即可。 –

2

一種解決方案是創建屬於只讀類immutable對象。您可以定義一個類,使得該類中的任何方法都不會更改對象的內部狀態。在這樣的類中,由於只能讀取內部狀態,因此別名不會產生影響,因此如果許多代碼段正在讀取相同的對象,則沒有任何問題。

要創建不可變對象採取以下鏈接看看:

  1. how-to-create-immutable-objects-in-java
0

下面的代碼將確保您的類始終是隻讀的,但如果你發現任何循環孔,請張貼在這裏。

import java.io.Serializable; 

final public class ImmutableClass implements Cloneable,Serializable { 
    private static final long serialVersionUID = 6488148163144293060L; 
    private static volatile ImmutableClass instance; 

    private ImmutableClass() { 
     // no-op 
     System.out.println("instance created : " + this.hashCode()); 
    } 

    /** 
    * Lazy Instantiation 
    * 
    * @return 
    */ 
    public static ImmutableClass getInstance() { 
     if (instance == null) { 
      synchronized (ImmutableClass.class) { 
       System.out.println("aquired lock"); 
       if (instance == null) { 
        instance = new ImmutableClass() { 
        }; 
       } 
       System.out.println("released lock"); 
      } 
     } 
     return instance; 
    } 

    public Object readResolve() { 
     System.out.println("readResolve()"); 
     return getInstance(); 
    } 

    @Override 
    public Object clone() throws CloneNotSupportedException { 
     throw new CloneNotSupportedException(); 
    } 

} 
0

Read-only類意味着,我們正在談論「IMMUTABLE」概念。

下面的例子描述了相同的:

public class ImmutableString { 
    static String upcase(String s) { 
     return s.toUpperCase(); // here local variable s vanishes 
       // it return the value to a new String object 
    } 

    public static void main(String[] args) { 
     String s = new String("abc"); 
     System.out.println(s); //abc 

     String s1 = upcase(s); 

     System.out.println(s1); //ABC 
     System.out.println(s); //abc 
    } 
} 
0

,讓我們看看一個只讀版本的對象,

案例1:如果你的類包含了不指向任何其他對象的字段例如:

public class Person{ 
private String name; 
//Getters n Setters 
} 
在這種情況下

,您可以返回這個類的一個副本,寫一個接受的人,誰想要得到一個Person對象都會有這個副本的任何一個構造函數對象,以便任何二傳手操作不會影響原來的對象(字符串是不可變的)

案例2:如果您的對象包含一個指向另一個對象或列表或地圖

在這種情況下

使類實現它有一個接口只有只讀的方法(吸氣劑),並隨時隨地可以返回對象,更改它返回這個接口,所以客戶端將只能訪問只讀方法

如:

class Person implements ReadOnly{ 
String name; 
.. assume pointers also in here 
// Getter n Setters 

public PersonReadOnly(){ 
    return this; 
} 
} 

interface PersonReadOnly { 
public String getName(); 
}