gpt4 book ai didi

language-agnostic - 构造函数:完整的还是最小的?

转载 作者:行者123 更新时间:2023-12-05 01:34:46 24 4
gpt4 key购买 nike

在设计类时,您通常必须在以下两者之间做出决定:

  • 提供一个“完整”的构造函数,它将所有必需字段的初始值作为参数:使用起来笨拙但保证完全初始化和有效的对象
  • 只为所有必需的字段提供“默认”构造函数和访问器:有时可能很方便,但不能保证在调用某些关键方法之前所有成员都已正确初始化。
  • 混合方法(更多代码,更多工作,不能消除“未完全初始化”的问题)

我见过几个 API 和框架使用上述之一,甚至是一种因类而异的不一致方法。您对该主题有何想法和最佳做法?

最佳答案

简短的回答是,一个对象应该在其构造函数被调用后被完全初始化。

这应该是默认方法,不会让用户感到意外。在某些情况下,您的运行时、框架或其他技术限制会阻止默认方法。

在某些情况下,Builder 模式有助于支持无法使用简单构造函数的情况。这种方法处于中间立场,让用户调用 setter 进行初始化,并且仍然只能使用完全初始化的对象。

静态工厂方法适用于对象构造函数需要比构造函数更灵活但构建器太复杂而无法实现的情况。

构造函数:

x = new X(a, b);

二传手:

x = new X();
x.setA(a);
x.setB(b);

build 者:

builder = new Builder();
builder.setA(a);
builder.setB(b);
x = builder.build();

静态工厂方法:

x = X.newX(a, b);

所有四种方法都将生成一个实例 x,属于 X 类。

构造函数

优点:

  • 简单

缺点:

  • 由于限制可能无法实现
  • 可能需要太多的构造函数参数(如果语言支持命名参数和默认值,这里会有所帮助:new X(a = "a", b = "c"))

二传手

优点:

  • 中等复杂度
  • 可能由框架强制要求

缺点:

  • 实例可能没有完全初始化

build 者

优点:

  • 最灵活的方法
  • 可以重用实例(在内部使用单例、享元和缓存)

缺点:

  • 实现起来最复杂
  • 可能会为无效的初始化对象产生运行时异常
  • 构建器对象实例的开销

静态工厂方法

优点:

  • 中等复杂度
  • 可以重用实例(在内部使用单例、享元和缓存)

缺点:

  • 比构造函数更难以实现和使用

关于language-agnostic - 构造函数:完整的还是最小的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1945102/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com