在准备面试时,有人提到知道如何将 java 中的类/方法设为只读。我一直在做一些搜索,但没有找到任何真正具体的东西。
也许这个问题比我想象的更容易回答,但是在java中使类或方法只读的方法是什么?
一种解决方案是创建immutable
属于只读类的对象。您可以定义一个类,使类中的任何方法都不会导致对象的内部状态发生变化。在这样的类中,别名没有影响,因为您只能读取内部状态,因此如果许多代码正在读取同一个对象,则没有问题。
要创建不可变对象,请查看以下链接:
类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
}
}
以下代码将确保您的课程始终是只读的,但如果您发现任何漏洞,请在此处发布。
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();
}
}
假设您想要一个对象的只读版本,
情况 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();
}
简单规则:没有任何公共字段和没有公共设置方法。
例如,请参见下面的类:
final class AReadOnlyClass
{
private int anInt;
public int GetAnInt()
{
return anInt;
}
}