面向对象编程语言中的引用默认情况下是否应该不可为空? [关闭]

2024-05-20

空指针被描述为“十亿美元的错误 http://lambda-the-ultimate.org/node/3186"。某些语言具有不能分配 null 值的引用类型。

我想知道在设计一种新的面向对象语言时,默认行为是否应该是引用以防止被分配 null。然后可以使用特殊版本来覆盖此行为。例如:

MyClass notNullable = new MyClass();
notNullable = null; // Error!
// a la C#, where "T?" means "Nullable<T>"
MyClass? nullable = new MyClass();
nullable = null; // Allowed

所以我的问题是,有什么理由不在新的编程语言中这样做呢?

EDIT:

我想补充一点指出不可空类型在数组中使用时存在一个特殊问题。我还要感谢大家的有用见解。非常有帮助,抱歉我只能选择一个答案。


我认为默认情况下不可为空引用类型的主要障碍是编程社区的某些部分更喜欢创建-设置-使用模式:

x = new Foo()
x.Prop <- someInitValue
x.DoSomething()

重载构造函数:

x = new Foo(someInitValue)
x.DoSomething()

这使得 API 设计者对实例变量的初始值感到困惑,否则实例变量的初始值可能为 null。

当然,就像“null”本身一样,创建-设置-使用模式本身会创建许多无意义的对象状态并阻止有用的不变量,因此摆脱它确实是一种祝福而不是诅咒。然而,它确实以许多人不熟悉的方式影响了一些 API 设计,所以这不是一件容易做的事情。

但总的来说,是的,如果有一场巨大的灾难摧毁了所有现有的语言和编译器,人们只能希望当我们重建时我们不会重复这个特定的错误。可空性是例外,而不是规则!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

面向对象编程语言中的引用默认情况下是否应该不可为空? [关闭] 的相关文章

  • 使用绑定和空值命中 Oracle 索引的最佳查询

    我有一个表 该表在多个列上有一个索引 其中许多列可以为空 CREATE UNIQUE INDEX UX MYTABLE A B C D E ON MYTABLE A B C D E 现在 我在 C 代码中尝试检查该表并精确命中索引 对于每个
  • java.lang.Object#getClass() 的 Eclipse 外部空注释

    我正在使用 Eclipse Mars 中提供的外部空注释工具 我正在尝试添加外部注释java lang Object getClass 但似乎无法正确签名 我尝试过以下变体 NonNull Class getClass L1java lan
  • 操作方法:短路倒三元运算符在例如中实现C#?有关系吗?

    假设您使用三元运算符 空合并运算符或嵌套 if else 语句来选择对对象的赋值 现在假设在条件语句中 您要评估昂贵或易失的操作 要求将结果放入临时变量中 捕获其状态 以便可以对其进行比较 然后可能进行赋值 考虑一下 诸如 C 之类的语言如
  • 在 Kotlin 中,处理可为空值、引用或转换它们的惯用方法是什么

    如果我有一个可为空的类型Xyz 我想引用它或将其转换为不可空类型Xyz 在 Kotlin 中这样做的惯用方法是什么 例如 这段代码是错误的 val something Xyz createPossiblyNullXyz something
  • 添加 Nullable int 时保持 null?

    我想添加可为空的int 并保留null当所有值都是null 我想要这个结果 1 2 3 1 null 1 null null null O null 0 问题是 如果我将一个值与 null 相加 结果为 null int i1 1 int
  • 如何测试哈希函数?

    有没有办法测试哈希函数的质量 我希望在哈希表中使用时具有良好的分布 如果这可以在单元测试中验证 那就太好了 EDIT 为了澄清 我的问题是我已经使用了longJava 中的值的方式是第一个 32 位编码一个 ID 第二个 32 位编码另一个
  • 将 RGB 转换为灰度/强度

    当从 RGB 转换为灰度时 据说应该对 R G 和 B 通道应用特定的权重 这些权重是 0 2989 0 5870 0 1140 据说这是因为人类对这三种颜色的感知 感受不同 有时也有人说这些是用于计算 NTSC 信号的值 但是 我在网上没
  • 编程语言之间的关系

    我想知道以下问题 这是什么意思 有些语言是 另一个的子集 超集 http www c2 com cgi wiki ForeignFunctionInterface 能 是用数学来定义的吗 是吗 与子集 超集相关 初等集合论中的概念 几乎所有
  • C# 中成员访问中的问号是什么意思?

    有人可以向我解释一下以下代码中会员访问中的问号是什么意思吗 它是标准 C 的一部分吗 尝试在 Xamarin Studio 中编译此文件时出现解析错误 this AnalyzerLoadFailed Invoke this new Anal
  • 什么是 NOR 逻辑运算符?

    Is nor a 或 b a 或 b a 和 b 还有什么吗 a 或 b see http en wikipedia org wiki Logical NOR http en wikipedia org wiki Logical NOR了解
  • 如何计算某物是否位于某人的视野中

    我有一个对象 它在 2D 空间中具有位置和速度 两者都由向量表示 对象的视野每侧均为 135 度 它看起来与移动的方向相同 速度矢量 我有一些对象 其在 2D 空间中的位置由向量表示 在图中 蓝色背景上的对象是可见的 红色背景上的对象对主体
  • 如何在 JavaScript 中检查未定义或 null 变量?

    我们经常在 JavaScript 代码中使用以下代码模式 if typeof some variable undefined some variable null Do something with some variable 是否有一种不
  • 检查 SQL MAX() 函数返回 null

    我的问题是 如果我的表为空或者我使用 max 函数的列没有我指定的值 那么为什么 sqlDataReader hasRows TRUE 它给出了空记录 我该如何解决这个问题 提前致谢 像 MAX 这样的聚合函数将始终为每组返回一行 就您而言
  • JavaScript 将 NULL 转换为 0

    我正在使用 jQuery 来获取元素的高度 但如果该元素不存在 以下代码将返回 NULL height menu li active ul height returns integer or null 这是一种跨浏览器安全的方法 可以使用以
  • 无法隐式转换 bool 类型?

    我正在尝试转换可为空的布尔值 但收到此错误 Cannot implicitly convert type bool to bool An explicit conversion exists are you missing a cast 例
  • 如何在 psycopg 中使用 SELECT 查询找到空值?

    我在 python 中使用 psycopg2 库INSERT当我用 None 插入 null 值时 查询效果很好 但是当我想做的时候SELECTnull 值 None 不返回任何值 cur execute SELECT id FROM re
  • 当平方和为N时,如何找到四个变量的所有可能值?

    A 2 B 2 C 2 D 2 N给定一个整数N 打印出整数值的所有可能组合ABCD求解方程 我猜我们可以比暴力做得更好 天真的暴力会是这样的 n 3200724 lim sqrt n 1 for a 0 a lt lim a for b
  • 填充体积算法

    我有一个具有一定尺寸长度 宽度 高度的盒子 我有不同长度 宽度 高度的物品 是否有现有的算法可以确定放入盒子中的最佳物品 这称为装箱 切割库存 背包问题 并且是 NP 难问题 一般来说 您只能通过使用启发式方法获得近似解 请参见示例 htt
  • 从原点开始在离散 2D 网格上迭代向外螺旋的算法

    例如 这是预期螺旋的形状 以及迭代的每个步骤 y 16 15 14 13 12 17 4 3 2 11 18 5 0 1 10 x 19 6 7 8 9 20 21 22 23 24 其中线条是 x 轴和 y 轴 以下是算法每次迭代 返回
  • 通过 __get() 通过引用返回 null

    快速规格 PHP 5 3 error reporting 1 the highest 我正在使用 get 通过引用技巧神奇地访问对象中任意深度的数组元素 快速示例 public function get key return isset t

随机推荐

  • 如何判断应用程序是否是Web应用程序

    在 Windows 服务和 Web 应用程序中运行的核心程序集中 我需要存储每个用户会话的信息 该服务将具有单个用户会话 并且 Web 应用程序使用 HttpContext Current 我想配置在核心程序集中使用哪种方法 约定优于配置
  • 通过标识引用对象的标准方法(例如循环引用)?

    JSON 中是否有通过身份引用对象的标准方法 例如 具有大量 可能是循环 引用的图形和其他数据结构可以被合理地序列化 加载吗 Edit 我知道做一次性解决方案很容易 列出图中所有节点的列表 然后 我想知道是否有一个标准的 通用的解决方案来解
  • Plesk Windows 部署 Node.js

    我创建了一个以 Node js 作为后端的 Angular 项目 这是服务器文件结构 Home directory httpdocs node hm dist browser folder server folder server js p
  • 在 WooCommerce 中添加到购物车之前清空购物车

    我正在使用 WP 作业管理器和 Woo Subscriptions Now 最初 我选择了一个套餐 Woo Subscription 然后我添加了所有细节 但没有提交 回到网站 所以要再次购买 我需要选择一个套餐 于是我选择了套餐并填写了详
  • 识别操作系统

    我在 Intel 编译器上的 Fortran 90 代码取决于它运行的操作系统 例如 if OS win7 then do X else if OS linux then do y end if 我如何以编程方式执行此操作 您可以使用预处理
  • jquery 验证错误位置

    这看起来很简单 但我无法弄清楚 我正在使用 jquery 验证插件 我验证所有文件 但我想要的是在输入文本行中显示验证消息警报 例如在电子邮件输入中 请填写电子邮件地址 但现在它出现在所有字段下 在我的html中
  • 如何使用 Plotly 中的直方图将所有离群值分入一个分箱?

    所以问题是 我可以在 Plotly 中绘制直方图 其中所有大于某个阈值的值都将被分组到一个箱中吗 所需的输出 但使用标准情节Histogram类我只能得到这个输出 import pandas as pd from plotly import
  • 如何从 Retrofit2 获取字符串响应?

    我正在做 android 正在寻找一种方法来执行超级基本的 http GET POST 请求 我不断收到错误 java lang IllegalArgumentException Unable to create converter for
  • 重写 URL,将 ID 替换为查询字符串中的标题

    我对 mod rewrite 很陌生 但我做了一些搜索 但找不到这个问题的答案 我有一个网站 它只有一个 PHP 页面 根据查询字符串中传递给它的 ID 提供数十页内容 我想重写 URL 以便此 ID消失并替换为从数据库中提取的页面标题 例
  • 使用 EWS 托管 API 为其他用户创建约会?

    在 EWS 托管 API 中 可以轻松地为特定用户创建约会 ExchangeService service new ExchangeService service Credentials new NetworkCredentials adm
  • 从 ffmpeg 获取实时输出以在进度条中使用(PyQt4,stdout)

    我已经查看了很多问题 但仍然无法完全弄清楚 我正在使用 PyQt 并且希望能够运行ffmpeg i file mp4 file avi并获取流式输出 以便我可以创建进度条 我看过这些问题 ffmpeg可以显示进度条吗 https stack
  • SQLite + SpatiaLite 问题

    我正在尝试使用 System Data SQLite 提供程序从 C 访问 SpatiaLite 当我尝试加载 SpatiaLite 扩展时 我总是得到 System Data SQLite SQLiteException SQLite e
  • 具有 Firebase (FCM) 推送通知的 Node js

    我正在使用 Node js 开发 REST api 并且有一个休息端点来发送 firebase 推送通知 我的代码如下 const bodyParser require body parser var cors require cors v
  • Renderscript 示例构建错误

    所以我想尝试使用 RenderScript 的示例 并在 Eclipse 中导入了 HelloWorld 但它给了我这样的错误 2011 10 25 13 10 48 HelloWorld home mileoresko workspace
  • 如何使用open xml sdk获取word文档的所有合并字段

    我是初学者打开xml sdk 我试图找出文档的所有合并字段 但我没有得到页眉和页脚合并字段 任何人都可以提出一个可行的解决方案吗 我正在尝试这样的事情 foreach FieldCode field in docGenerated Main
  • 使用位操作查找字符串中的重复项时出现问题

    我认为 我已经实现了正确的逻辑来查找字符串是否包含重复项 但即使在终端中没有打印任何内容 我也无法理解为什么会这样 那么我在这个程序中犯了哪些错误 任何人都可以解释为什么它不起作用 include
  • 如何以编程方式断开拨出呼叫

    我使用以下代码以编程方式断开呼叫 但它不起作用 private void callDisconnect try TelephonyManager manager TelephonyManager this getSystemService
  • 提升条件变量 - 对“notify_one”的调用是否堆栈?

    在使用 Boost 线程的单个生产者 单个消费者应用程序中 如果生产者线程多次调用cond var notify one 在消费者线程调用之前cond var wait lock 是否会额外致电notify one被堆叠起来 这样每次调用
  • 使用 SSRS ASP.NET ReportViewer 和 Web 服务进行 Windows 身份验证

    我目前在使用 SSRS 时遇到一些问题 我有一个使用 Windows 身份验证的 ASP NET 网站 这工作正常 我知道网站当前用户是当前登录的用户 此站点上有一个 Web 表单 ReportViewer 当我不设置凭据时 这工作正常 然
  • 面向对象编程语言中的引用默认情况下是否应该不可为空? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi