【问题标题】:Is it possible to have a method that can return different class objects in Java depending on the condition?是否有可能有一种方法可以根据条件在 Java 中返回不同的类对象?
【发布时间】:2020-09-21 18:01:37
【问题描述】:

如何创建一个方法来根据某些条件返回不同的不可变类对象?

如果不可能,是否有替代方法来解决这个问题?

public class ArriveEvent {
    private final List<Server> list;
    private final Customer cust;

    ArriveEvent(Customer ppl, List<Server> listing){
        this.list = listing;
        this.cust = ppl;
    }

    PutSomethingHere? execute(){
    }

    public String toString() {
        return String.format("%.3f %d arrives", cust.giveArrival(), cust.giveID());
    }
}

主要问题是execute() 根据列表中不可变class Server 的条件返回不同的语句,这些语句具有不同的属性,例如可用性或是否有其他客户在线。

private final boolean avail;
private final boolean anyoneWaitingInLine;

这是要求:

jshell> new ArriveEvent(new Customer(1, 0.5), Arrays.asList(new Server(1, false, false, 0), new Server(2, true, false, 0))).execute() // Two servers: (1) busy; (2) free
$.. ==> 0.500 1 served by 2
jshell> new ArriveEvent(new Customer(1, 0.5), Arrays.asList(new Server(1, false, false, 0), new Server(2, true, false, 0))).execute().execute()
$.. ==> 1.500 1 done serving by 2
jshell> new ArriveEvent(new Customer(1, 0.5), Arrays.asList(new Server(1, false, true, 5.0), new Server(2, false, false, 10.0))).execute() // Both servers busy, (1) has waiting customers
$.. ==> 0.500 1 waits to be served by 2
jshell> new ArriveEvent(new Customer(1, 0.5), Arrays.asList(new Server(1, false, true, 5.0), new Server(2, false, false, 10.0))).execute().execute()
$.. ==> 10.000 1 served by 2
jshell> new ArriveEvent(new Customer(1, 0.5), Arrays.asList(new Server(1, false, true, 5.0), new Server(2, false, false, 10.0))).execute().execute().execute()
$.. ==> 11.000 1 done serving by 2
jshell> new ArriveEvent(new Customer(1, 0.5), Arrays.asList(new Server(1, false, true, 5.0), new Server(2, false, true, 10.0))).execute() // Both busy with waiting customer
$.. ==> 0.500 1 leaves

我最初的想法是创建多个类servedbywaitdoneservingleaveextendsArrivalEvent class,因为我需要不同的toStrings(),具体取决于服务器的情况和客户,然后当我运行 execute() 时,它将根据服务器和客户的情况返回扩展 ArrivalEvent 类的不同类,并有另一个覆盖 execute() 的类返回其中的一个类。

【问题讨论】:

  • 是否有可能有一个方法可以根据条件在 java 中返回不同的类对象? - 是的,只有那些不同的类将扩展一些公共基类/类型。
  • 是的,我最初的计划是创建扩展 ArrivalEvent 类的“servedby”、“wait”、“doneserving”、“leave”,执行将根据服务器的条件返回这些子类之一在列表中,我该怎么做?
  • 查看答案。
  • 您能否将该信息移至您的问题(没有“编辑:”、“更新”等 - 问题应该显示为今天写的)? Stack Overflow is not a forum。你可以edit your question

标签: java class oop methods


【解决方案1】:

是的,我最初的计划是创建扩展 ArrivalEvent 类的“servedby”、“wait”、“doneserving”、“leave”,执行将根据服务器内部的条件返回这些子类之一列表,我该怎么做?

首先,关于您现有代码的几点说明:

  1. 始终尊重 Java Naming Conventions,使用 PascalCase 和方法命名您的类 - 使用 camelCase。您评论中的示例为doneserving,应为DoneServing
  2. 按照同样的约定,尽量用名词作为你的类名;
  3. 你的.toString() 使用了giveArrival()giveID(),它们没有在你的代码中定义,所以你的sn-p 不会编译;
  4. 您没有提供CustomerServer 的类定义。

现在,在考虑了所有这些之后,如果我们假设您的原始代码中包含所有必要的类(相应地命名),您的工作代码将如下所示:

class ServedBy extends ArrivalEvenet {
    //...
}

class Wait extends ArrivalEvenet {
    //...
}

class DoneServing extends ArrivalEvenet {
    //...
}

class Leave extends ArrivalEvenet {
    //...
}

class ArrivalEvenet {

}

public class ArriveEvent {

    private final List<Server> list;
    private final Customer cust;

    ArriveEvent(Customer ppl, List<Server> listing){
        this.list = listing;
        this.cust = ppl;
    }

    public String toString() {
        return String.format("%.3f %d arrives", cust.giveArrival(), cust.giveID());
    }

    ArrivalEvenet execute(ArrivalEvenet object) {
        if (/*your condition*/) {
            return new ServedBy(); //alternatively create your object
        } else if (/*your condition*/) {
            return new Wait(); //alternatively create your object
        } else if (/*your condition*/) {
            return new DoneServing(); //alternatively create your object
        } else if (/*your condition*/) {
            return new Leave(); //alternatively create your object
        } else {
            throw new IllegalArgumentException("Wrong type has been provided");
        }
    }
}

/*your condition*/ 看起来像 list.get(...)==...

【讨论】:

  • java 是如何工作的,这样返回一个新的 ServedBy()/Wait() 不会给出错误,因为它不是不会返回 ArrivalEvent 类型?
  • 请自己做一些研究。您可以阅读this 以开始了解继承。如果 Dog 扩展了 Animal,这意味着 Dog 是一个 Animal。所以,如果你的方法说 I return Animal,它可以返回任何是 Animal 的东西(即扩展 Dog)。
  • 啊,我明白了,我之前确实读过它,但似乎我对这个话题有误解,非常感谢!
【解决方案2】:

你可以在这里使用重构

public <T> T execute(){
    Object obj = getObject(ArriveEvent, ArriveEvent.getClass()) // Pass element as per condition
}

public static <T> T getObject(Object o, Class<T> type){
    if(type.isInstance(o)){
        return type.cast(o)
    }
    else{
        return null;
    }
}

【讨论】:

  • 这个东西甚至不会编译。另外,你应该解释它是如何解决问题的。
  • 谢谢提及,我应该给出更多解释。这是来自我的一个应用程序的工作代码。基于问题,期望是根据条件获得不同的对象,例如 ClassA,ClassB 。所以,如果对于 condition1 ,我通过 getObject(ClassA,ClassA.class) ..我得到类 A 的对象。我可以访问所有方法使用重构的 A 类。 B 类反之亦然。希望对您有所帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-17
  • 2011-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多