小编Mic*_*rry的帖子

Java 中的不可变关键字是个好主意吗?

一般来说,我在 Java 中使用不可变对象的次数越多,我就越认为它们是一个好主意。从自动线程安全到无需担心克隆或复制构造函数,它们有很多优点。

这让我想到,“不可变”关键字会出错吗?显然,在语言中添加另一个保留字有一些缺点,我怀疑这主要是由于上述原因而实际上会发生 - 但忽略了我真的看不到很多缺点。

目前必须非常小心以确保对象是不可变的,即使这样,一个狡猾的 javadoc 评论声称一个组件对象是不可变的,而实际上它是不可变的,这可能会破坏整个事情。还有一种说法是,即使像字符串这样的基本对象也不是真正不可变的,因为它们很容易受到反射攻击。

如果我们有一个不可变的关键字,编译器肯定可以递归检查并给出一个铁一般的保证,即一个类的所有实例都是不可变的,这是目前无法做到的。尤其是随着并发越来越多,我个人觉得给这个效果加个关键字比较好。但是是否有任何我遗漏的缺点或实现细节使这成为一个坏主意?

java immutability keyword

4
推荐指数
1
解决办法
1488
查看次数

Javadoc警告不予置评

如果没有为方法或类提供javadoc注释,是否有办法(最好通过参数,标记,doclet或类似方法)让Javadoc生成警告?我已经在选项和谷歌搜索了一个侦察员,但看不到任何突出的相关性.我目前正在开发一个项目,其中所有内容都需要具有某种形式的Javadoc注释,这对于此目的非常有用.

编辑:我知道这些事情可以通过代码质量工具强制执行,例如checkstyle,我只是想知道是否有办法配置Javadoc来警告不同的事情,比如这个.

java javadoc

4
推荐指数
2
解决办法
1556
查看次数

用Java获取所有DVD驱动器

获取驱动器根目录后,Java中是否存在跨平台方式来检查是否有任何驱动器:

  • 一个DVD驱动器
  • ...包含磁盘?

我希望用户能够选择DVD进行播放,并将选项缩小到DVD驱动器,而不是包括其他驱动器(如笔式驱动器,硬盘驱动器等)在这种情况下会有所帮助.如果我能得到这样的驱动器列表,显示哪些包含磁盘将再次有用(同样的原因.)

搜索后我虽然没有找到任何方法来做这个不涉及平台特定的hackery.那里有什么吗?

java dvd cross-platform file

4
推荐指数
1
解决办法
2032
查看次数

查找事件派发线程违规

我们都知道我们应该从事件调度线程完成所有与GUI相关的任务,否则可能会引入奇怪的错误 - 我试着记住这个规则,但我必须承认我最近注意到了几个我没有的地方.

有没有办法识别所有违反此规则的行为,以便修复它们?我已经看到这里有一个相关的findbugs规则,但它似乎并没有抓住我的所有情况.即使在发生违规时抛出异常也很好,所以我可以修复它(或者捕获异常并记录警告以防用户遇到相关问题.)

人们通常采取什么方法?

java swing code-analysis event-dispatch-thread

4
推荐指数
1
解决办法
1241
查看次数

使用int或Integer

在我的代码中有很多最终值,比如10000.它们永远不会改变,我什么都不做,只是有时检查if(number1 == number2).

是否更好地使用intInteger用于此类数字?

java int integer

4
推荐指数
2
解决办法
2002
查看次数

java计算的意外结果

为什么以下代码:

System.out.println((int)(19.99 * 100));

产生结果"1998"?

java

4
推荐指数
2
解决办法
209
查看次数

奇怪的JavaFX8 OutOfMemoryError - FadeTransition

经过几个小时的尝试追踪我的应用程序中的内存错误,我已经设法在一个简单的JFX程序中将其减少为一些非常奇怪的行为:

采用以下简单示例,逐渐将矩形淡入透明画布:

public class Test extends Application {

    @Override
    public void start(Stage primaryStage) {
        primaryStage.initStyle(StageStyle.TRANSPARENT);
        int width = 1920;
        int height = 1080;

        Rectangle rect = new Rectangle(width, height);
        rect.setFill(Color.SALMON);
        rect.setOpacity(0);
        StackPane scenePane = new StackPane();
        scenePane.getChildren().add(rect);
        primaryStage.setScene(new Scene(scenePane));
        primaryStage.setWidth(width);
        primaryStage.setHeight(height);
        primaryStage.show();
        FadeTransition ft = new FadeTransition(Duration.millis(10000), rect);
        ft.setToValue(1);
        ft.play();
    }

    public static void main(String[] args) {
        launch(args);
    }

}
Run Code Online (Sandbox Code Playgroud)

使用VM args运行时-Xms100m -Xmx100m,这根本不会有任何问题.但是,当我给VM大大增加内存(例如-Xms1000m -Xmx1000m)时,它会很快崩溃:

java.lang.OutOfMemoryError
        at sun.misc.Unsafe.allocateMemory(Native Method)
        at java.nio.DirectByteBuffer.<init>(DirectByteBuffer.java:127)
        at java.nio.ByteBuffer.allocateDirect(ByteBuffer.java:311) …
Run Code Online (Sandbox Code Playgroud)

java memory-leaks javafx fade javafx-8

4
推荐指数
1
解决办法
526
查看次数

代码段的时间复杂度

从在线笔记中,我阅读了以下用于反转字符串的java代码片段,据称该字符串具有二次时间复杂度.在我看来,我的"for"循环只是迭代s的整个长度.它是如何导致二次时间复杂度的?

public static String reverse(String s)
{
  String rev = new String();
  for (int i = (s.length()-1); i>=0; i--) {
      rev = rev.append(s.charAt(i));
  }
  return rev.toString();
}
Run Code Online (Sandbox Code Playgroud)

java string algorithm data-structures

3
推荐指数
1
解决办法
550
查看次数

需要Jbuttons透明外观

我正在使用Java Netbeans GUI Builder来制作GUI.我想给按钮一个透明(有光泽)的外观.我正在使用

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
Run Code Online (Sandbox Code Playgroud)

这也给了GUI很好的外观,但按钮仍然是相同的无聊按钮.

那么,如何给按钮一个透明的外观呢?

java swing transparency netbeans look-and-feel

3
推荐指数
1
解决办法
6963
查看次数

在JDK7中,有没有办法在移动文件时使用三元运算符来有条件地使用REPLACE_EXISTING?

我不喜欢下面的代码看起来如何,我想知道如何使用三元运算符来做到这一点:

if (isIndexed) {
    Files.move(source, destination);
}
else {
    Files.move(source, destination, StandardCopyOption.REPLACE_EXISTING);
}
Run Code Online (Sandbox Code Playgroud)

我期待的东西看起来像:

Files.move(source, destination, isIndexed ? xxxx : StandardCopyOption.REPLACE_EXISTING);
Run Code Online (Sandbox Code Playgroud)

如果我可以使用某种"默认"复制选项,我认为这将是我正在寻找的.但是StandardCopyOption的枚举没有"NONE"选项.

所以我可能错过了一些东西.它是什么?

java java-7

3
推荐指数
1
解决办法
100
查看次数