Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.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 为什么我需要使用setter和自定义构造函数?_Java - Fatal编程技术网

Java 为什么我需要使用setter和自定义构造函数?

Java 为什么我需要使用setter和自定义构造函数?,java,Java,首先,请原谅,如果这是一个愚蠢的问题,但我会举一个例子来澄清 public class Example{ private String InstanceVariable1="whatever"; //setting a value for the sake of the example Example(){ } Example(String InstanceVariable1) { this.InstanceVariable1=Instanc

首先,请原谅,如果这是一个愚蠢的问题,但我会举一个例子来澄清

public class Example{

    private String InstanceVariable1="whatever"; //setting a value for the sake of the example

    Example(){
    }

    Example(String InstanceVariable1) {
        this.InstanceVariable1=InstanceVariable1;
    }
}

为什么我在这里需要二传手?我的自定义构造函数不是将StaseCavaBabLe1的值设置为什么吗?

你不知道,但是在设计任何系统时,你必须考虑哪些参数对你的类是必不可少的,哪些参数是可选的,哪些可能需要在类

的生命期内改变。 对于强制的事情-没有它们类就无法完成它的工作-将它们作为构造函数的参数,以便必须提供它们

对于可选的东西,可以在构造函数中设置一个合理的默认值,但是让使用类的开发人员稍后通过setter设置它们

对于在实例生命周期内实际发生变化的参数,它们确实需要一个setter,因为您只能调用构造函数一次

您可能会为希望提供但也希望更改的内容选择构造函数和setter,并且您可能只为肯定不会更改的内容选择构造函数。这是一个混合和平衡的什么你的类需要开始,并需要工作。尽量减少必要的构造函数参数数量

我还要指出,您提供了一个无参数构造函数。如果您不提供setter,但确实为开发人员提供了一种在不提供值的情况下构造类的方法,那么您可能会遇到一种情况,即值从未设置,也不可设置。考虑一个无参数的构造函数是否是一个明智的条款

例如,一个Person类可能需要一个性别指示——他们从出生起就有性别,尽管有些人的目标是在没有性别指示的情况下工作。考虑让性别成为建构时间的规定。 一个人的工作变化很大,在施工时他们真的没有工作,或者他们可能永远也没有工作。大多数人生来就没有名字,在一段时间内,他们可能会在没有名字的情况下实际工作。一个名字稍后会被正式指定,并且可能会在这个人的一生中发生变化。工作和名字可能是二传手的好人选。如果您正在编写一个只处理工作年龄人群的系统,那么Job可能是一个构造函数参数,尽管null可能是一个有效值,表示他们没有构造函数参数。一个人的出生地是在构造时设置的,并且在实例的生命周期内不会改变-如果类知道出生地甚至完成其工作的任何部分都是必要的,那么它可能是一个好的构造函数/唯一的选项

为什么我在这里需要二传手

你没有

我的自定义构造函数没有将InstanceVariable1的值设置为任何值吗

是,因为初始值设定项被重新定位到构造函数,并且它也被设置为构造函数接收的参数值

如果希望能够通过方法设置实例变量的值,则只需要setter。通常的原因是设置一个私有实例变量。这个类没有任何setter,很好:

class Example {
    private int foo;

    Example(int foo) {
        this.foo = foo;
    }

    public int getFoo() {
        return this.foo;
    }
}

没有任何外部的例子可以设置foo。不需要setter,除非您希望示例之外的内容能够设置foo。

如果通过设计构造函数设置的所有对象字段,则可以将这些字段设置为final。您不需要设置器来设置其值。保证实例化后没有状态变化的最后一个对象称为不可变。在多线程环境中使用和共享不可变对象是安全的

public final class Example {

    private final String instanceVariable1;//setting a value for the sake of the example

    Example(String instanceVariable1) {
        this.instanceVariable1 = instanceVariable1;
    }

    //All getters
    public String getInstanceVariable(){
        return this.instanceVariable1;
    }
}

通过提供setter,这意味着对象状态可以在实例化后更改为可更改。当不再是不变的时,它需要对其状态的读写进行特殊的保护同步。这在并发访问同一可变对象实例时是正确的。

什么使您认为您需要setter?不需要。如果以后需要更改变量值,则需要设置器。我为什么需要设置器错误404:未找到Setter。-如果不打算在构造后更改InstanceVariable1的值,请删除默认构造函数,删除InstanceVariable1的初始值并将其设置为最终值。这样,示例是-在Java中,字段名应该以小写字符开头。因此,InstanceVariable1应该以小写字符开头。请正确格式化您的代码。@jbnize让我这么想的是我正在解决的一个问题的解决方案,他们使用的是setter,对我来说似乎完全没有必要。很抱歉,我不熟悉这个类。也许解决方案需要setter来修改实例变量的值。或者该类被用于另一个需要setter的用例中。或者,实现该解决方案的人可能会为每个实例变量添加setter,尽管这完全没有必要。谢谢!我不得不等几分钟才接受你的回答,但这真的很有帮助。