【问题标题】:How to return object while initializing variable in java?java中如何在初始化变量时返回对象?
【发布时间】:2018-06-26 17:59:06
【问题描述】:

有没有什么方法可以在java中声明这样的静态变量,例如在初始化之后我可以返回java对象

我们可以像这样在python中做到这一点

schedule.every(10).minutes.do(job)

在哪里,通过调用 every(10)。分钟我只是初始化分钟变量。

在java中也可以做这样的事情吗?

类似这样的:

Myclass.function().variable.anothorFunction();

编辑:

就方法而言,我也可以像这样在 java 中轻松做到这一点。

public static MyClass function(){
      return new MyClass();
}

【问题讨论】:

  • 是的。您只需从方法中返回一个值。
  • 请查看我的编辑@ErnestKiwele
  • @NitinKhanna 那么您将无法调用方法来执行您的要求。
  • @NitinKhanna 然后在 Java 中,就像在 Python 中一样,.variable 属性必须使用您的 .anotherfunc() 方法返回一个对象。再说一次,我不确定你认为 Python 在这里做了哪些在 Java 中难以处理的事情。
  • 我总是很乐意提供帮助,您的问题也有一些有趣的转折点;)...我也感谢您的快速接受!

标签: java python static static-methods


【解决方案1】:

我首先假设 python sn-p 有效,因为 python 有generators and yield。哪个Java没有。在 Java 中,方法返回 一个 值,并且仅返回一个值。您可以在 JVM 平台上获得的最接近的是 Scala 提供的 loop/yield 构造。 或者,Java 8 Streams。

但是考虑到 cmets,我仔细查看了您的示例,导致了这个 python module。整个事情归结为 schedule.every() 返回一个调度程序对象,该对象只是根据通过“流利”接口传入的持续时间调用传递给它的 函数 job

您可以在 Java 中做类似的事情,将 static 方法放在某个类上,该方法只是创建某个 Scheduler 类的实例,然后您传递一个 lambda/方法引用。

当然,Java 也有执行此操作的内置机制,例如 ScheduledExecutorService

【讨论】:

  • 嗯,你可以手工制作这些,在每个阶段返回带有上下文信息的不同类型的对象,但这很费力......
  • 流可以做到这一点吗?
  • 我没有看到任何关于 schedule.every(10).minutes.do(job) 暗示生成器的信息。如果有的话,它意味着return self 允许流畅接口的方法,这通常不被认为是Pythonic,尽管一些库实现了它(值得注意的是,标准库中通常不存在它)。不过,我真的不明白 OP 在寻找什么……
  • @GhostCat 一个复杂的问题:查看the source code.minute 属性实际上是一个 Python descriptor,但这只是一个实现特定协议的对象(@ 987654332@ 和 __set__)。我不确定 Java 等价物是什么,但可能只是另一个对象会做,尽管没有语法糖类属性访问
  • @NitinKhanna 注意,另一个复杂点,schedule.every 实际上是一个模块级函数(java 没有的东西,一切都必须在一个类定义),它简单地包装了对 default_scheduler.every 方法的调用,其中 default_scheduler 是放入模块命名空间的全局 Scheduler 对象,即 default_scheduler = Scheduler()
【解决方案2】:

假设schedule 是对象引用而不是类引用,您可以通过在方法完成后返回this 轻松做到这一点。请看这个简化的例子:

public class MyClass {

   public OtherClass variable;

   public MyClass function(){
       // do stuff

       return this;
   }
}

public class OtherClass {

    public void anotherFunction(){
        // do other stuff
    }
}

然后可以这样使用:

MyClass myObj = ...;

myObj.function().variable.anotherFunction();

更好的方法是直接返回 variable 本身:

public OtherClass function(){
    // do stuff

    return variable;
}

然后可以这样使用:

myObj.function().anotherFunction();

【讨论】:

    猜你喜欢
    • 2013-07-04
    • 1970-01-01
    • 1970-01-01
    • 2019-08-28
    • 2019-05-17
    • 2014-04-15
    • 1970-01-01
    • 1970-01-01
    • 2013-04-05
    相关资源
    最近更新 更多