为什么对字符串使用默认垃圾值是错误的?
Why using default trash value for string is wrong?
tl;dr;
为什么使用
string myVariable = "someInitialValueDifferentThanUserValue99999999999";
默认值有误吗?
情况说明:
我在工作场所与一位同事进行了讨论。
他提议使用一些垃圾值作为默认值,以区别于用户值。
一个简单的例子是这样的:
string myVariable = "someInitialValueDifferentThanUserValue99999999999";
...
if(myVariable == "someInitialValueDifferentThanUserValue99999999999")
{
...
}
这对我来说是非常明显和直观的,这是错误的。
但除此之外,我无法对此给出一个很好的论据:
- 这不专业
- 有人输入相同值的可能性很小。
有一次我读到,如果你有这样的情况,你的架构或编程习惯是错误的。
编辑:
谢谢你的回答。找到了让我满意的方案,分享给大家:
最好做一个bool guard值来指示特定对象的初始化是否已经完成。
并且基于这个私有 bool 变量,我可以推断出我使用的字符串是来自我的机制(即初始化期间)的默认空值“”还是来自用户的空值。
对我来说,这是一种更优雅的方式。
可选
可选用。
Returns an empty Optional instance. No value is present for this Optional.
API Note:
Though it may be tempting to do so, avoid testing if an object is empty by comparing with == against instances returned by Option.empty(). There is no guarantee that it is a singleton. Instead, use isPresent().
参考:Optional
服务器和客户端共享的自定义转义序列
- 定义默认值
- 当用户输入默认值时,转义用户值
使用标记字符
- 始终将第一个字符定义为标记字符
- 根据这个字符做出决定并去除这个字符以进行任何实际比较
- 为检查定义清晰的边界,因为跨多个抽象传播此字符会导致代码维护问题。
关于“不专业”的小阐述:
这通常是个坏主意,因为
- 当它不是常量时会浪费内存(至少在 Java - 当然,除非你使用非常有限的 space 可以忽略不计)。
- 即使是常量,一旦您有更多 classes、包或项目,它也可能会引入歧义(“是 NO_INPUT、INPUT_NOT_PROVIDED、INPUT_NONE 吗?”)
- 通常这表明项目文档中不会像其他答案中建议的那样标准化范围限制Defined_Marker_Character
- 它在如何处理决定是否已提供输入方面引入了歧义
最后你要么在不同的 class 中有很多不同的 NO_INPUT
常量,要么最终得到一个自定义的 SthUtility
class 来定义一个常量 SthUtility.NO_INPUT
和一个静态方法 boolean SthUtility.isInputEmpty(...)
将给定输入与该常量进行比较,这基本上是重新发明 Optional
。您将把那个 class 复制粘贴到您的每个项目中。
确实没有必要,因为您可以从 Java 11
开始执行以下操作,这是四个版本前的版本。
String value = "";
// true only if length == 0
if (value.isEmpty()) {
System.out.println("Value is empty");
}
String value = " ";
// true if empty or contains only white space
if (value.isBlank()) {
System.out.println("Value is blank");
}
而且我更愿意限制可以在 class 文件中搜索的此类字符串的使用,这可能会导致代码被利用。
tl;dr;
为什么使用
string myVariable = "someInitialValueDifferentThanUserValue99999999999";
默认值有误吗?
情况说明:
我在工作场所与一位同事进行了讨论。
他提议使用一些垃圾值作为默认值,以区别于用户值。 一个简单的例子是这样的:
string myVariable = "someInitialValueDifferentThanUserValue99999999999";
...
if(myVariable == "someInitialValueDifferentThanUserValue99999999999")
{
...
}
这对我来说是非常明显和直观的,这是错误的。 但除此之外,我无法对此给出一个很好的论据:
- 这不专业
- 有人输入相同值的可能性很小。
有一次我读到,如果你有这样的情况,你的架构或编程习惯是错误的。
编辑: 谢谢你的回答。找到了让我满意的方案,分享给大家:
最好做一个bool guard值来指示特定对象的初始化是否已经完成。
并且基于这个私有 bool 变量,我可以推断出我使用的字符串是来自我的机制(即初始化期间)的默认空值“”还是来自用户的空值。
对我来说,这是一种更优雅的方式。
可选
可选用。
Returns an empty Optional instance. No value is present for this Optional.API Note:
Though it may be tempting to do so, avoid testing if an object is empty by comparing with == against instances returned by Option.empty(). There is no guarantee that it is a singleton. Instead, use isPresent().
参考:Optional
服务器和客户端共享的自定义转义序列
- 定义默认值
- 当用户输入默认值时,转义用户值
使用标记字符
- 始终将第一个字符定义为标记字符
- 根据这个字符做出决定并去除这个字符以进行任何实际比较
- 为检查定义清晰的边界,因为跨多个抽象传播此字符会导致代码维护问题。
关于“不专业”的小阐述: 这通常是个坏主意,因为
- 当它不是常量时会浪费内存(至少在 Java - 当然,除非你使用非常有限的 space 可以忽略不计)。
- 即使是常量,一旦您有更多 classes、包或项目,它也可能会引入歧义(“是 NO_INPUT、INPUT_NOT_PROVIDED、INPUT_NONE 吗?”)
- 通常这表明项目文档中不会像其他答案中建议的那样标准化范围限制Defined_Marker_Character
- 它在如何处理决定是否已提供输入方面引入了歧义
最后你要么在不同的 class 中有很多不同的 NO_INPUT
常量,要么最终得到一个自定义的 SthUtility
class 来定义一个常量 SthUtility.NO_INPUT
和一个静态方法 boolean SthUtility.isInputEmpty(...)
将给定输入与该常量进行比较,这基本上是重新发明 Optional
。您将把那个 class 复制粘贴到您的每个项目中。
确实没有必要,因为您可以从 Java 11
开始执行以下操作,这是四个版本前的版本。
String value = "";
// true only if length == 0
if (value.isEmpty()) {
System.out.println("Value is empty");
}
String value = " ";
// true if empty or contains only white space
if (value.isBlank()) {
System.out.println("Value is blank");
}
而且我更愿意限制可以在 class 文件中搜索的此类字符串的使用,这可能会导致代码被利用。