Java 是否可以使函数返回true、false或对象列表? 节目简介
我正在开发一个存储如下数据的程序: -事实:属性列表(或仅一个)和真/假值(称为“真”值)的组合。例如: 父母(“约翰”、“小约翰”),对 其中,Java 是否可以使函数返回true、false或对象列表? 节目简介,java,information-retrieval,data-handling,Java,Information Retrieval,Data Handling,我正在开发一个存储如下数据的程序: -事实:属性列表(或仅一个)和真/假值(称为“真”值)的组合。例如: 父母(“约翰”、“小约翰”),对 其中,John作为John jr的父项的属性为true。我用于存储事实的代码: public class Fact implements Serializable{ private boolean truth; private ArrayList<Property> properties; public Fact(){
John
作为John jr
的父项的属性为true。我用于存储事实的代码:
public class Fact implements Serializable{
private boolean truth;
private ArrayList<Property> properties;
public Fact(){
truth = false;
properties = new ArrayList<Property>();
}
//more constructors, getters, setters and other functions which are not important for this question...
信息集
事实和规则存储在informationset
中,这些信息集将这些事实和规则捆绑在一起,以便用户可以“询问”其中的信息。这可以通过两种不同的方式完成:
1.事实检查:检查事实是否属实。给定一个事实,它将根据该事实的真值返回true或false。例如,用户可以询问:
父母(“约翰”、“小约翰”)
程序将返回true
,同时:
父母(“小约翰”、“小约翰”)
将返回false
问号表示用户希望提出“事实检查”问题
1.执行检查:这将针对给定事实(称为问题事实)返回可应用于问题事实的每个规则的事实列表。例如:
父母(‘约翰’、‘小约翰’)=>
这将返回:
孩子(‘小约翰’、‘约翰’)
箭头表示用户希望询问“执行检查”问题
问题编码如下:
public class Question {
Fact questionFact;
String operator;
public Question(Fact questionFact, String operator) throws InvalidOperatorException{
if(!validOperator(operator))
throw new InvalidOperatorException("The operator is invalid");
this.questionFact = questionFact;
this.operator = operator;
}
在操作员
字段中,我根据用户想问的问题类型存储?
或=>
问题
我现在需要编写一个方法,向给定的信息集提问。所以我需要一个方法,给定一个问题,一个信息集返回true
,false
或一个事实列表。据我所知,这在java中是不可能的
我试着为每个问题制定一个单独的方法,这有点可行,但这也会导致一个问题,因为我希望能够写出如下内容:
informationSet.ask(问题)代码>
并让ask()
方法处理这两种类型的问题,这样我就不必在用户界面代码中检查用户问的是哪种问题,而是让程序后端解决它
有什么好方法可以做到这一点呢?因此,最明显的解决方案是实现自定义响应类
另一个想法是考虑使用一个设计来保持A或B类型的值(双关语)。p>
因此,它可能看起来像:
Either<Boolean, List<Fact>> result = foo();
如果要访问右侧:
result.right()
.map(...)
.filter(...)
// ...
除了Grzegorz的主张之外,您还应该记住Java是强类型的。这并不意味着不能返回对象;根据定义,它可以容纳不同的类(类型)
但在Java逻辑中,我认为最好以更窄的粒度实现更多的方法(这在面向对象设计中有很多好处,比如共享代码和可伸缩性)
所以我建议提出两种方法,一种用于布尔运算,另一种用于数组结果。然后在调用者函数中进行条件测试。但是可以用两个字段将三个选项封装在类响应中:枚举响应类型(TRUE、FALSE、FACTS)和事实列表。正如您所说的,同一个方法在Java中不能返回两种不同的类型:boolean和Fact。这可能是一个选项。我只需要确保不要同时使用两者…我选择了fist选项。一个response类,它还存储用户提出的问题类型。通过这种方式,我可以轻松地检查用户要求的内容,并相应地从响应中提取数据。谢谢你抽出时间!是的,这会起作用,但这意味着我必须在GUI的代码中这样做,我希望尽可能将程序的后端和GUI分开。为什么不能在后端进行测试?问问你自己,你可能会找到另一个选择。不管怎样,都有。
result.left()
.map(...)
.filter(...)
// ...
result.right()
.map(...)
.filter(...)
// ...