好的。我在写代码,有一个问题。语言是C#,但没关系。例如: 我上课要点
Class Point
{
private _x;
private _y;
//getter and setters
}
因此,如果我想使用此类的对象,我需要完全知道所有字段,例如_x和_y都已初始化。默认值无法解决。我的解决方案:
但是如果我有7个必填字段。
Class Point
{
private _x; //required it must not be null
private _y; //required it must not be null
private _z; //required it must not be null
private _b; //required it must not be null
private _a; //required it must not be null
private _f; //required it must not be null
private _h; //required it must not be null
//getter and setters
}
我如何确定所有这些都已初始化?在构造函数中传递这些参数实在是很困难和丑陋。如果我将使用构建器模式,则实际上并不能确定。 对不起,英语不好。
答案 0 :(得分:0)
正如人们评论的那样,您可以通过将字段设置为始终具有默认值来确保对字段进行初始化
void initState
或让您的构造函数始终为每个字段定义默认值
Class Point
{
private int j = 42;
}
这将确保无论何时创建该类的新实例,都将始终初始化字段。
如果您有需要指向对象的引用,则可以以相同的方式进行操作,只是将值(例如上例中的42)更改为与C#的Class Point
{
private int j;
public Point (int jVal)
{
j = -1;
}
}
等效的语言。
答案 1 :(得分:0)
要知道,如果字段已初始化,则必须使用标志。
使其显式g.V('unique-value'). ...
或如果bool _xIsSet;
是_x
,则将类型设为int
并检查该值为空。
前者不会引发任何异常,但是如果您不小心,将使用未初始化的值。
后一种方法会引发错误;可能会更好,但仍在运行时。
您可以改为选择属性,并使用null进行检查来包装字段,但结果将相同。任何错误都会影响运行时间。 (或完全没有)
方法我从20开始就更喜欢?年是要有一个接受所有参数的构造函数,甚至要确保没有默认的构造函数。
int?
在更高版本的C#版本中,可以命名参数,因此代码变得非常易于阅读。
var myPoint = new Point(
valueX,
valueY,
valueK
);
除了使用您所声明的方法外,我对使用此方法的解释是:“您很少希望var myPoint = new Point(
X = valueX,
Y = valueY,
L = valueK // <-- see here! it is quite easy to spot a possible error
);
的设置不完全。”然后...如果有几种方法可以完全设置Customer
,则可以创建更多的构造函数。
我已经做得更进一步了,并尽可能避免使用null,因此在我的代码中,从不一个Customer
仅设置了一半,很少使用{{1} }为空。
最近我开始尝试使用静态构造函数。则呼叫为Customer
。它具有DDD的味道,因为Customer
可以表达意图,可以表达为什么创建类。 var customer = Customer.Create(...)
或Create
。