只读类/方法

时间:2013-01-10 04:36:23

标签: java oop

在准备面试时,有人提到知道如何在java中创建一个只读的类/方法。我一直在做一些搜索,但没有找到任何真正具体的东西。

也许这个问题比我正在做的更容易回答,但是什么方法可以让一个类或方法在java中只读?

5 个答案:

答案 0 :(得分:2)

一种解决方案是创建属于只读类的immutable个对象。您可以定义一个类,以便类中的任何方法都不会导致更改对象的内部状态。在这样的类中,别名没有影响,因为你只能读取内部状态,所以如果许多代码段正在读取同一个对象,那就没问题了。

要创建不可变对象,请查看以下链接:

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

答案 1 :(得分: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();
    }

}

答案 2 :(得分: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 
    } 
}  

答案 3 :(得分:0)

假设您想要一个对象的只读版本,

案例1:如果您的类包含不是指向任何其他对象的指针的字段,例如:

public class Person{
private String name;
//Getters n Setters
}

在这种情况下,您可以返回此类的副本,编写一个接受Person的构造函数,任何想要获取Person对象的人都将拥有此对象的副本,因此任何Setter操作都不会影响原始对象(字符串)是不可改变的)

案例2:如果您的对象包含指向另一个对象或列表或地图的指针

在这种情况下,make类实现一个只有只读方法(Getters)的接口,无论你在哪里返回对象,都要更改它以返回这个接口,这样客户端就只能访问只读方法

例如:

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

 public PersonReadOnly(){
  return this;
}
}

interface PersonReadOnly {
public String getName();
}

答案 4 :(得分:-1)

简单规则:没有任何公共字段和没有公共设置方法。

例如,请参阅以下课程:

final class AReadOnlyClass
{
    private int anInt;

    public int GetAnInt()
    {
        return anInt;
    }
}