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(...)
  // ...