给出一个课程:
N/A
然后你就像使用它一样:
public class NicePeople {
public string VNP_Name;
public int VNP_Age;
public float VNP_Score;
public NicePeople(string inName, int inAge, float inScore){
VNP_Name = inName;
VNP_Age = inAge;
VNP_Score = inScore;
}
}
它和之间有什么区别:
NicePeople nicePerson = new NicePeople("Joe", 55, 1.6f);
如果没有,构造函数只是为了你想做一些额外的工作(比如检查有效值等)而基本的东西完全不需要吗?
答案 0 :(得分:3)
这里真正的问题是何时使用构造函数参数vs属性。其他人已经提到了原因。这是另一个。
如果没有这些值,则无法创建类实例时使用参数化构造函数。可以使用属性设置实例的任何可选属性。考虑一个Person
类。任何人都需要至少一个名称来识别。但是,年龄可以是可选信息。
public class Person {
public Person(string name) {
Name = name;
}
public string Name { get; private set; }
public int Age { get; set; }
}
答案 1 :(得分:1)
字段VS.属性强>
第一种方式,您只是将它们列为无需访问者公开访问的字段:
public string VNP_Name;
public int VNP_Age;
public float VNP_Score;
第二种方式是使用访问者包装字段。它被称为属性,是一个类的成员,而不仅仅是一个字段。比如这个:
public string VNP_Name {set;get;}
public int VNP_Age {set;get;}
public float VNP_Score {set;get;}
如果它们被分开,这些将作为正常的get set语句。您也可以这样做,这使得属性只能由类设置,但可以公开获取:
public string VNP_Name { private set; get;}
public int VNP_Age { private set; get;}
public float VNP_Score { private set; get;}
至于构造函数是否值得关注 他们是一样的。您可以像在字段中一样轻松地在构造函数中设置字段。
答案 2 :(得分:0)
埃里卡, 实际上,您可以使用构造函数来验证输入以设置类变量。虽然,您也可以让您的setter方法在更新类变量的值之前对输入进行一些验证。使用setter方法从构造函数设置值有一个优点,即如果您希望对象具有不变性。在程序中使用并发时,这是一个很好的考虑因素。然后使用构造函数用于该情况下的基本和更高级的要求。因此,如果要使对象不可变,则只能使用构造函数路径来填充最终的类变量。这意味着您使用构造函数参数提供的输入中的值创建实例,并且永远不能更改它们。它有利于代码的并发性,安全性和完整性。在下面的示例中,我将保证SQLFile(此处包含的查询)和我的DAOHelper(数据库资源)将始终与我在应用程序启动期间启动的相同。这里没有setter方法来更新我的实例成员sqlFile和daoHelper的值。希望这会有所帮助。
private final SQLFile sqlFile;
private final DAOHelper daoHelper;
@Inject
public MapMetricsDAOImpl(@Named(SQLFILE_BEAN_NAME) final SQLFile sqlFile,
final DAOHelper daoHelper) throws SQLException {
this.sqlFile = sqlFile;
this.daoHelper = daoHelper;
}