Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在类上构建只读包装器_Java_Interface_Builder - Fatal编程技术网

Java 在类上构建只读包装器

Java 在类上构建只读包装器,java,interface,builder,Java,Interface,Builder,我的课程如下: class A{ // it has some getters and setters } 还有另一个类叫做builder类,它构建类A class BuilderA{ // builds A and returns an instance. } 现在我想准备一个只读类a,它确保类newA只包含类a的getter,而不包含setter 我这样做是为了确保如果我通过了这个newA,我是安全的,没有人可以使用getter,也没有人可以对newA进行任何更改,如果我直

我的课程如下:

 class A{
  // it has some getters and setters
 }
还有另一个类叫做builder类,它构建类A

class BuilderA{
   // builds A and returns an instance.
}
现在我想准备一个只读类a,它确保类newA只包含类a的getter,而不包含setter

我这样做是为了确保如果我通过了这个newA,我是安全的,没有人可以使用getter,也没有人可以对newA进行任何更改,如果我直接使用类A的话


有人能告诉我如何实现这一点吗?

如果您想要一个通用的问题解决方案,您必须将getter和setter提取到一个接口中,然后使用a截取以set开头的所有方法或对它们进行注释(并在处理程序中处理注释)然后要么什么都不做,要么更愿意抛出一个不支持的操作异常


如果您只需要1或2个类tho就需要它,这将是过分的,并且通常会带来更大的开销。

如果您想要一个通用的问题解决方案,您必须将getter和setter提取到一个接口中,然后使用a截取以set开头的所有方法,或者对它们进行注释(并在处理程序中处理注释),然后要么不执行任何操作,要么宁愿抛出UnsupportedOperationException


如果您只需要1或2个类tho就需要它,这将是过分的,并且通常会带来更大的开销。

您可以扩展类a并实现引发不支持的操作异常的setter,或者在调用时什么都不做。您不能关闭对类a的公共setter方法的访问,而仍然是类a的实例(通过子类化)。

您可以扩展类A并实现setter,这些setter在调用时抛出不支持的操作异常或什么都不做。您不能关闭对类A的公共setter方法的访问,而仍然是类A的实例(通过子类化)。

下面是一个示例:

public class Person {
    String name;

    public Person(String name) {
        this.name = name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

public class ImmutablePerson extends Person {

    public ImmutablePerson(String name) {
        super(name);
    }

    @Override
    public void setName(String name) {
        throw new UnsupportedOperationException();
    }
}

public class PersonBuilder {
    public static Person createMutablePerson(String name) {
        return new Person(name);
    }

    public static Person createImmutablePerson(String name) {
        return new ImmutablePerson(name);
    }
}
虽然这是可行的,但我认为这不是用Java设计类的好方法

引用Joshua Bloch的“有效Java”,类应该是不可变的,除非您有很好的理由说明它们应该是可变的。

下面是一个示例:

public class Person {
    String name;

    public Person(String name) {
        this.name = name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

public class ImmutablePerson extends Person {

    public ImmutablePerson(String name) {
        super(name);
    }

    @Override
    public void setName(String name) {
        throw new UnsupportedOperationException();
    }
}

public class PersonBuilder {
    public static Person createMutablePerson(String name) {
        return new Person(name);
    }

    public static Person createImmutablePerson(String name) {
        return new ImmutablePerson(name);
    }
}
虽然这是可行的,但我认为这不是用Java设计类的好方法

引用Joshua Bloch的“Effective Java”,类应该是不可变的,除非你有很好的理由说明它们应该是可变的。

你可以很容易地使用a(
Java.lang.reflect.Proxy
),然后你只需查看调用的方法名(大致检查它是否以
set
开头)。开销应该相对最小,并且不需要为每个附加类编写代码。您可以使用注释和进一步的编码来指定允许/拒绝的setter

public static boolean isSetter(Method method){
    if(!method.getName().startsWith("set"))    return false;
    if(method.getParameterTypes().length != 1) return false;  
    return true;
}
您可以很容易地为此使用(
java.lang.reflect.Proxy
),然后只需查看调用的方法名(大致检查它是否以
set
开头)。开销应该相对最小,并且不需要为每个附加类编写代码。您可以使用注释和进一步的编码来指定允许/拒绝的setter

public static boolean isSetter(Method method){
    if(!method.getName().startsWith("set"))    return false;
    if(method.getParameterTypes().length != 1) return false;  
    return true;
}

另一个选项是使用不可变类(仅getter)并使用生成器创建它们好的,但这不是一种类型安全的方法,你只会在运行时注意到有人在
ImmutablePerson
上调用setter。事实上,这不是一个好的设计。这就是为什么我建议使用一个不可变的类。这个注释搞乱了extends关键字的使用。正如回答者所说,这在很多方面都是错误的所以我不得不说。然而,他提供的选项也不是你问题的解决方案。相反,解决方案应该是Ok的选项3,但这不是一种类型安全的方式,你只会在运行时注意到有人在
不可变的人
上调用setter。事实上,这不是一个好的设计。这就是为什么我建议使用不可变的类。此注释将extends关键字的使用搞砸了。这在很多方面都是错误的,因为回答者也觉得有必要这么说。但是,他提供的选项也不是问题的解决方案。相反,解决方案是的选项3