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,尽管这完全没有必要。谢谢!我不得不等几分钟才接受你的回答,但这真的很有帮助。