在准备面试时,有人提到知道如何在java中创建一个只读的类/方法。我一直在做一些搜索,但没有找到任何真正具体的东西。
也许这个问题比我正在做的更容易回答,但是什么方法可以让一个类或方法在java中只读?
答案 0 :(得分:2)
一种解决方案是创建属于只读类的immutable
个对象。您可以定义一个类,以便类中的任何方法都不会导致更改对象的内部状态。在这样的类中,别名没有影响,因为你只能读取内部状态,所以如果许多代码段正在读取同一个对象,那就没问题了。
要创建不可变对象,请查看以下链接:
答案 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;
}
}