我需要创建一个安全的构造函数,它只在值正确的情况下构建对象,所以我想在构造函数中返回null(而不是创建对象的实例)如何做到这一点?
在我的班级Aresta中,从构造函数返回null并不起作用;
export class Aresta{
private feromonioAtual : number;
private distancia : number;
private noFim: No;
constructor(noFim:No, distancia:number){
if(distancia<=0){
//null return isn't work :(
return null;
}
this.feromonioAtual = 1;
this.noFim = noFim;
this.distancia = distancia;
}
}
答案 0 :(得分:1)
这种验证是在工厂外的类外处理的。
export class Aresta {
private feromonioAtual: number;
private distancia: number;
private noFim: number;
constructor(noFim: number, distancia: number) {
this.feromonioAtual = 1;
this.noFim = noFim;
this.distancia = distancia;
}
}
export class ArestaFactory {
public static buildAresta(noFim: number, distancia: number): Aresta {
if (distancia <= 0) {
return null; // or throw an exception
}
return new Aresta(noFim, distancia);
}
}
可悲的是,直到现在,打字稿中没有打包/模块私有访问者,但是关于它的故障单已在他们的github here中打开。
答案 1 :(得分:1)
我会为此使用工厂方法,它允许您从其他代码隐藏构造函数。它可以返回null
或Aresta
的实例,并且可以包含检查构造值所需的任何验证。
export class Aresta{
private feromonioAtual : number;
private distancia : number;
private noFim: No;
public static GetInstance(noFim: No, distancia: number) : Aresta | null {
if(distancia <= 0){
return null;
}
return new Aresta(noFim, distancia);
}
private constructor(noFim: No, distancia: number) {
this.feromonioAtual = 1;
this.noFim = noFim;
this.distancia = distancia;
}
}
使用工厂方法创建对象,而不是构造函数:
const aresta1 = Aresta.GetInstance(null, 0);
const aresta2 = Aresta.GetInstance(null, 10);