布尔类型转换系统(Java)


Boolean Type Conversion Systems (Java)

我正在考虑一个用于灵活模板系统的类型转换系统。我需要将任何对象类型映射到有意义的布尔值,以提高灵活性和可用性。

有很多事情需要考虑,我们喜欢工作系统,所以我们首先考虑现有的解决方案。

例如,在PHP中,存在以下布尔值的转换系统:

如果不是,则认为(布尔值)为真:

  • false(布尔值)
  • 0(整数、长、短、字节、BigInteger)
  • 0.0(浮动)
  • "(字符串)
  • 空数组
  • 空集合或映射
  • null

现在的问题是,这是否是一个好的系统?其他系统还使用哪些规则?这个有什么缺点?

我目前也在考虑这个系统:

除了之外,所有的东西都是假的

  • true(布尔值)
  • 1(数字)
  • "true"(字符串)
  • 不为null(对象)
  • 非空数组或集合或映射

这也很容易。

[更新]

为您提供更多信息。模板系统是用Java开发的,与Web组件相关。它的特点是像OGNL这样的脚本语言,它具有额外的功能,如调用方法、访问环境提供的特殊功能(如可插入的辅助方法和宏)。

它使用一个自定义类型转换系统,只需将结果从一种类型(类)转换为另一种(其他类)。因此,对于每个允许的类型转换,它都形成一个简单的二维矩阵。可以在单个组合中添加多个转换器,但不能保证使用哪一个。

今天,我想把任何东西都映射到Boolean.class的替代品上。我自己使用过几种脚本语言,我想知道有什么不同的方法,每种方法在可读性、表达性和简单性方面的优缺点是什么。

[/Update]

自动转换为布尔值可以被视为"特殊值意味着失败"习语的变体。这很容易出错,因为不同的操作使用不同的值来达到有效返回值范围不同的目的。设计一种只考虑一个用例的编程语言总是很危险的…

让我们从第一个例子(php)开始:

  • 0表示false:大多数indexOf方法(Collections、Strings…)返回-1表示"未找到",而零是有效值。InputStream.read也是如此
  • 0.0(float)的意思是false:这几乎没有用。真正不存在的值有NaN,而零经常是一个有效的结果,没有理由让它比+4.9E-324更特别
  • "quot;(String)表示false:查看BufferedReader.readLine:在读取文本文件时,空的String是有效值。null标志着文件的结束
  • 空数组、空集合或映射:与下一项冲突
  • null表示false:如果Collections和Strings不是一个对象,这可能很有用,但在使用子类时更改规则不是一个好主意。当然,在某些情况下,null是一个有效值,而您必须查看异常或特殊的错误变量

关于您的考虑:

除了之外,所有的东西都是假的

  • true(布尔值)
  • 1(数字)
  • "真";(字符串)
  • 不为null(对象)
  • 非空数组或集合或映射

您知道任何一个Java API,其中一个(而且只有一个)是成功的指标,而其他所有值都是失败的吗?看来这个规则根本没有用。"true"字符串的情况几乎相似。除了系统属性之外,没有人返回"true"String,其中他可以只返回布尔值true。不谈案件敏感性问题或问题,为什么不接受"是";,等等,并且它与您稍后考虑的非CCD_ 16规则相冲突。如果在应用自动布尔转换之前将String强制转换为Object,会有什么不同?数组/集合规则的模糊性相同。


在某些语言中,精心选择的与该语言库同步的自动转换可能会产生令人信服的结果。但我从没见过。所有支持这种转换的语言都有其陷阱或"当…时不要使用"规则。如果你想将Java绑定到你的脚本语言,那么它的好处就不太可能超过错误的风险。Java API被设计为与没有这种自动转换功能的语言一起使用。

据我所知,我希望这能对你有所帮助。

没有什么问题。这只取决于您的要求。

  1. 在某些情况下,指定项所在的对象返回-1集合列表中不存在
  2. 编程语言如何遵循一些从低到低仍然遵循的标准级别语言,如汇编级别
  3. 因为在执行/编译过程中,所有高级语言都会转换为机器级语言。在这种情况下,现有系统将在转换高级代码的同时降低一些复杂性

我推荐的解决方案

在您的情况下,您可以使用条件运算符,例如

PHP

1. $is_tested = ($tested=="Completed") ? TRUE : FALSE; 
2. $is_tested = ($tested=="TRUE") ? TRUE : FALSE;

JAVA

1. boolean is_tested = (tested=="Completed") ? TRUE : FALSE; 
2. boolean is_tested = (tested=="TRUE") ? TRUE : FALSE;

对不起,我对java知识不多。

在IBM WEB Sphere中,PHP和Java 之间的类型转换

甚至我建议您参考IBMWEB-SPHERE进行类型转换。这是一个链接

我希望这能帮助你,给你更多的想法。