如何将实例设置为null(在构造函数中)?

时间:2018-05-14 12:12:18

标签: node.js typescript

我需要创建一个安全的构造函数,它只在值正确的情况下构建对象,所以我想在构造函数中返回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;
    }
}

2 个答案:

答案 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)

我会为此使用工厂方法,它允许您从其他代码隐藏构造函数。它可以返回nullAresta的实例,并且可以包含检查构造值所需的任何验证。

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);