我正在考虑一个用于灵活模板系统的类型转换系统。我需要将任何对象类型映射到有意义的布尔值,以提高灵活性和可用性。
有很多事情需要考虑,我们喜欢工作系统,所以我们首先考虑现有的解决方案。
例如,在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:如果
Collection
s和String
s不是一个对象,这可能很有用,但在使用子类时更改规则不是一个好主意。当然,在某些情况下,null
是一个有效值,而您必须查看异常或特殊的错误变量
关于您的考虑:
除了之外,所有的东西都是假的
- true(布尔值)
- 1(数字)
- "真";(字符串)
- 不为null(对象)
- 非空数组或集合或映射
您知道任何一个Java API,其中一个(而且只有一个)是成功的指标,而其他所有值都是失败的吗?看来这个规则根本没有用。"true"
字符串的情况几乎相似。除了系统属性之外,没有人返回"true"
的String
,其中他可以只返回布尔值true
。不谈案件敏感性问题或问题,为什么不接受"是";,等等,并且它与您稍后考虑的非CCD_ 16规则相冲突。如果在应用自动布尔转换之前将String
强制转换为Object
,会有什么不同?数组/集合规则的模糊性相同。
在某些语言中,精心选择的与该语言库同步的自动转换可能会产生令人信服的结果。但我从没见过。所有支持这种转换的语言都有其陷阱或"当…时不要使用"规则。如果你想将Java绑定到你的脚本语言,那么它的好处就不太可能超过错误的风险。Java API被设计为与没有这种自动转换功能的语言一起使用。
据我所知,我希望这能对你有所帮助。
没有什么问题。这只取决于您的要求。
- 在某些情况下,指定项所在的对象返回-1集合列表中不存在
- 编程语言如何遵循一些从低到低仍然遵循的标准级别语言,如汇编级别
- 因为在执行/编译过程中,所有高级语言都会转换为机器级语言。在这种情况下,现有系统将在转换高级代码的同时降低一些复杂性
我推荐的解决方案
在您的情况下,您可以使用条件运算符,例如
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进行类型转换。这是一个链接
我希望这能帮助你,给你更多的想法。