一般来说,我在 Java 中使用不可变对象的次数越多,我就越认为它们是一个好主意。从自动线程安全到无需担心克隆或复制构造函数,它们有很多优点。
这让我想到,“不可变”关键字会出错吗?显然,在语言中添加另一个保留字有一些缺点,我怀疑这主要是由于上述原因而实际上会发生 - 但忽略了我真的看不到很多缺点。
目前必须非常小心以确保对象是不可变的,即使这样,一个狡猾的 javadoc 评论声称一个组件对象是不可变的,而实际上它是不可变的,这可能会破坏整个事情。还有一种说法是,即使像字符串这样的基本对象也不是真正不可变的,因为它们很容易受到反射攻击。
如果我们有一个不可变的关键字,编译器肯定可以递归检查并给出一个铁一般的保证,即一个类的所有实例都是不可变的,这是目前无法做到的。尤其是随着并发越来越多,我个人觉得给这个效果加个关键字比较好。但是是否有任何我遗漏的缺点或实现细节使这成为一个坏主意?
如果没有为方法或类提供javadoc注释,是否有办法(最好通过参数,标记,doclet或类似方法)让Javadoc生成警告?我已经在选项和谷歌搜索了一个侦察员,但看不到任何突出的相关性.我目前正在开发一个项目,其中所有内容都需要具有某种形式的Javadoc注释,这对于此目的非常有用.
编辑:我知道这些事情可以通过代码质量工具强制执行,例如checkstyle,我只是想知道是否有办法配置Javadoc来警告不同的事情,比如这个.
获取驱动器根目录后,Java中是否存在跨平台方式来检查是否有任何驱动器:
我希望用户能够选择DVD进行播放,并将选项缩小到DVD驱动器,而不是包括其他驱动器(如笔式驱动器,硬盘驱动器等)在这种情况下会有所帮助.如果我能得到这样的驱动器列表,显示哪些包含磁盘将再次有用(同样的原因.)
搜索后我虽然没有找到任何方法来做这个不涉及平台特定的hackery.那里有什么吗?
我们都知道我们应该从事件调度线程完成所有与GUI相关的任务,否则可能会引入奇怪的错误 - 我试着记住这个规则,但我必须承认我最近注意到了几个我没有的地方.
有没有办法识别所有违反此规则的行为,以便修复它们?我已经看到这里有一个相关的findbugs规则,但它似乎并没有抓住我的所有情况.即使在发生违规时抛出异常也很好,所以我可以修复它(或者捕获异常并记录警告以防用户遇到相关问题.)
人们通常采取什么方法?
在我的代码中有很多最终值,比如10000.它们永远不会改变,我什么都不做,只是有时检查if(number1 == number2).
是否更好地使用int或Integer用于此类数字?
经过几个小时的尝试追踪我的应用程序中的内存错误,我已经设法在一个简单的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代码片段,据称该字符串具有二次时间复杂度.在我看来,我的"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 Netbeans GUI Builder来制作GUI.我想给按钮一个透明(有光泽)的外观.我正在使用
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
Run Code Online (Sandbox Code Playgroud)
这也给了GUI很好的外观,但按钮仍然是相同的无聊按钮.
那么,如何给按钮一个透明的外观呢?
我不喜欢下面的代码看起来如何,我想知道如何使用三元运算符来做到这一点:
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"选项.
所以我可能错过了一些东西.它是什么?