java - 为什么 Robot.delay(int ms) 限制为 1 分钟?

标签 java api-design awtrobot

我在执行我的软件时遇到以下异常:

Exception in thread "main" java.lang.IllegalArgumentException: Delay must be to 0 to 60,000ms
    at java.awt.Robot.checkDelayArgument(Robot.java:544)
    at java.awt.Robot.delay(Robot.java:534)
    at com.company.Main.main(Main.java:10)

令我惊讶的是,有 hibernate 时间限制,标准库异常消息有错误的语法/拼写错误(到 0 到 ?)。查看delay()方法的源代码后,我注意到它限制了等待时间,如异常所述:

/**
 * Sleeps for the specified time.
 * To catch any <code>InterruptedException</code>s that occur,
 * <code>Thread.sleep()</code> may be used instead.
 * @param   ms      time to sleep in milliseconds
 * @throws  IllegalArgumentException if <code>ms</code> is not between 0 and 60,000 milliseconds inclusive
 * @see     java.lang.Thread#sleep
 */
public synchronized void delay(int ms) {
    checkDelayArgument(ms);
    try {
        Thread.sleep(ms);
    } catch(InterruptedException ite) {
        ite.printStackTrace();
    }
}

private static final int MAX_DELAY = 60000;

private void checkDelayArgument(int ms) {
    if (ms < 0 || ms > MAX_DELAY) {
        throw new IllegalArgumentException("Delay must be to 0 to 60,000ms");
    }
}

为什么要这样做?这似乎是糟糕的 API 设计。它除了给你捕获多余的InterruptedException检查异常并同步调用外还有什么用?

最佳答案

除了原始开发人员之外,没有人能回答这个问题。

你可以很清楚地看到它所做的只是调用Thread::sleep,所以只做同样的事情。您不需要调用 Robot::delay

下面是完全等价的,没有任意限制

Robot r;
long sleepDuration = 60001;
synchronized (r) {
    try {
        Thread.sleep(sleepDuration);
    } catch(InterruptedException ite) {
        ite.printStackTrace();
    }
}

It seems like poor API design

这个类(class)是19岁。 JDK 中有很多糟糕的设计决策,尤其是在较旧的东西中。

关于java - 为什么 Robot.delay(int ms) 限制为 1 分钟?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58011112/

相关文章:

node.js - 如何以编程方式过滤与 API 端点匹配的用户名?

c# - 内部并在私有(private) api 中受到保护

java - 如何让机器人输入 `:` ?

java:编译后无法运行程序?帮我

没有外部库的 Java 字节码操作

java - 如何从不同的 XML 更改 ImageView 源?

java - 当同一个类存在于同一服务器上的不同应用程序中时,类加载如何工作?

java - 在 java 中使用 createBufferStrategy() 时,拥有 2 个以上的缓冲区是否有帮助?有缺点吗?

go - 如何验证服务器到服务器的通信

java - 如何将 BufferedImage 传递到 Filedialog 以在 Java 中保存?