0

有没有办法拒绝在构造方法中创建对象?

我的观点是设置一个与条件相关的额外参数。例如:

public Test(Rule rule){
    if(rule == Rule.Custom)
        //DO NOT CREATE
    else{
        this.rule = rule;
    }
}

//WORK IF rule IS Custom
//I want to pass this information to user
public Test(Rule rule, string extra){
    if(rule != Rule.Custom)
        //DO NOT CREATE
    else{
        this.rule = rule;
        this.extra = extra;
    }
}

也许我可以制作工厂方法,但我对解决方法感到好奇。

4

3 回答 3

2

听起来这种模式应该使用ArgumentOutOfRangeException

更改示例代码以显示此想法:

public Test(Rule rule)
{
    if (rule == Rule.Custom)
    {
        throw new ArgumentOutOfRangeException("rule", "A custom rule is not allowed");
    }

    this.rule = rule;
}

public Test(Rule rule, string extra)
{
    if (rule != Rule.Custom)
    {
        throw new ArgumentOutOfRangeException("rule", "Only a custom rule is allowed");
    }

    this.rule = rule;
    this.extra = extra;
}

来自 C++ 背景,我发现自己在过去可能使用过断言的地方越来越多地使用参数异常。

希望这可以帮助,

ps 从构造函数抛出的异常是完全可以接受的......

于 2012-04-15T23:55:59.123 回答
2

如果您的目的是抛出异常而只是不创建对象,那么工厂方法是您唯一真正的选择。那有两个模型:

  1. 如果不满足条件,则返回 null。
  2. 使用bool TryCreate(parameters ..., out Result)签名,其中将布尔值返回给表示成功或失败的调用。

当然,这些的真正问题是调用者无法知道对象创建失败的原因,并且需要查阅一些带外信息(文档)以获取更多信息。

于 2012-04-16T00:07:28.940 回答
1

你可以抛出异常。这将中止对象的创建并向调用者发出错误信号。

public Test(Rule rule){ 
  if(rule == Rule.Custom) 
    throw new WillNotCreateException();
  else{ 
    this.rule = rule; 
  } 
} 

WillNotCreateException您的自定义异常类型或常见异常类型之一在哪里(例如System.ArgumentException

于 2012-04-15T23:54:19.613 回答