2

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

也许这个问题比我想象的更容易回答,但是在java中使类或方法只读的方法是什么?

4

5 回答 5

2

一种解决方案是创建immutable属于只读类的对象。您可以定义一个类,使类中的任何方法都不会导致对象的内部状态发生变化。在这样的类中,别名没有影响,因为您只能读取内部状态,因此如果许多代码正在读取同一个对象,则没有问题。

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

  1. 如何在 Java 中创建不可变对象
于 2013-01-10T04:56:25.403 回答
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 
    } 
}  
于 2016-04-27T19:00:09.190 回答
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();
    }

}
于 2016-04-27T18:02:25.270 回答
0

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

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

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

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

情况 2:如果您的对象包含指向另一个对象或列表或映射的指针

在这种情况下,使类实现一个只有只读方法(Getters)的接口,并且无论您在何处返回对象,都将其更改为返回此接口,因此客户端将只能访问只读方法

例如:

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

 public PersonReadOnly(){
  return this;
}
}

interface PersonReadOnly {
public String getName();
}
于 2018-01-21T03:03:31.757 回答
-1

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

例如,请参见下面的类:

final class AReadOnlyClass
{
    private int anInt;

    public int GetAnInt()
    {
        return anInt;
    }
}
于 2013-01-10T04:41:10.477 回答