如何为位置记录定义其他初始化逻辑?

问题描述

如果验证失败,我想验证用于记录初始化和通过的参数。对于常规类,我可以为此使用构造函数,但是应该如何使用记录呢?

对于常规类,我还可以使用私有构造函数和公共静态工厂方法,这些方法返回错误或有效实例,但是似乎无法将记录的主构造函数设为私有。

对于非位置记录,就像其他任何类一样:

public record Person
{
    public string FirstName {get; init;}
    public string LastName {get; init;}
    
    public Person (string firstName,string lastName)
    {
        (FirstName,LastName) = (firstName,lastName);
    }
}

解决方法

添加到上面的注释中,您可以在使用工厂方法时通过使记录抽象并添加扩展它的私有嵌套类来隐藏主构造函数。

与具有私有构造函数的传统类不同,有人仍然可以扩展您的记录。但这确实可以防止消费者意外绕过工厂。

public abstract record Person(string FirstName,string LastName)
{
  public static Person Create(string FirstName,string LastName)
  {
    // ... validate arguments ...

    return new PersonImpl(FirstName,LastName);
  }

  private record PersonImpl(string FirstName,string LastName) 
    : Person(FirstName,LastName);
}

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...