我想知道在构造函数(也就是构造函数委托)中运行构造函数之间是否存在任何性能差异.
请不要将此问题解释为支持冗余,例如复制长构造函数以提高性能.据我所知,在大多数情况下,除了性能之外,还需要在构造函数中调用构造函数.(例如,可读性)
例如,这是Vector3D我最近创建的一个类:
public class Vector3D {
public final int x, y, z;
public Vector3D() {
this(0, 0, 0);
}
public Vector3D(int x, int y, int z) {
this.x = x;
this.y = y;
this.z = z;
}
}
Run Code Online (Sandbox Code Playgroud)
我是否会因为不打电话this(0, 0, 0)而单独设置变量而受益?
public class Vector3D {
public final int x, y, z;
public Vector3D() {
this.x = 0;
this.y = 0;
this.z = 0;
}
public Vector3D(int x, int y, …Run Code Online (Sandbox Code Playgroud) 我这里有一个Handler类,它应该处理Event某种类型的s:
public interface Handler<E extends Event>
{
public void handle(E event);
@SuppressWarnings("unchecked")
public default Class<E> getEventType()
{
for(Method method: this.getClass().getDeclaredMethods())
{
if(method.getName().equals("handle")) return (Class<E>)method.getParameterTypes()[0];
}
throw new NullPointerException("Couldn't find the 'handle' method in this handler.");
}
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,默认情况下,它会尝试通过在执行时Event返回方法的第一个参数类型来获取类型(而不是显式返回它).这适用于以下JUnit测试:handle()getEventType()Handler
public static class EmptyEvent extends Event
{
public void test() { }
}
public static Handler<EmptyEvent> genericHandler = new Handler<EmptyEvent>()
{
@Override
public void handle(EmptyEvent event)
{
}
};
@Test
public void testEventGenerics() …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Intellij IDEA与Maven构建Java插件,直到我遇到错误:
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 5.803 s
[INFO] Finished at: 2015-06-16T16:34:55-10:00
[INFO] Final Memory: 17M/216M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.18.1:test (default-test) on project mc-hyperchat: Error occurred in starting fork, check output in log -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information …Run Code Online (Sandbox Code Playgroud) 我无法PATH永久设置全局环境变量SETX.
我读过类似的问题的答案,如与SETX无效的语法以及阅读语法SS64.
据我所知,以下行遵循的语法SETX正确,也不要有两个以上的论点是:
SETX PATH "%PATH%"
Run Code Online (Sandbox Code Playgroud)
但这并不止于SETX给我这个错误:
ERROR: Invalid syntax. Default option is not allowed more than '2' time(s).
Type "SETX /?" for usage.
Run Code Online (Sandbox Code Playgroud)
上面的命令是在管理员实例上运行的cmd.exe.使问题更加陌生的原因是,在cmd.exe同一命令的用户实例上工作完美.
我简化了上面的命令以强调问题,但我真正想要运行的是:
SETX PATH "%PATH%;D:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin" /M
Run Code Online (Sandbox Code Playgroud)
当然,这给出了相同的确切错误,我不能在用户实例上运行它,cmd.exe因为我试图PATH永久地设置全局环境变量.(需要管理员访问权限)
在 Git Bash 的实例中,输入java -version会给出:
Error: could not open 'C:\Program Files (x86)\Java\jre7\lib\i386\jvm.cfg'
然而,我的实际 Java 路径是在D:\Program Files\Java\jdk1.8.0_45\bin. %PATH%如果我输入 或echo $PATH,这会显示在我的变量中env | grep PATH。
Git Bash 从哪里获取这个不存在的 Java 路径?
聚苯乙烯
除此之外,java -version在命令提示符中运行会给出正确的输出:
java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)
Run Code Online (Sandbox Code Playgroud) 看看这个:
public class Main {
private static List<Integer> list = new ArrayList<>();
public static void add(int x) {
if(list.contains(x)) {
return;
}
list.add(x);
}
public static void main() {
list.add(1);
list.add(1); //should it do nothing or throw an error?
}
}
Run Code Online (Sandbox Code Playgroud)
另外,请忽略我本可以使用 aSet<Integer>来消除对if(list.contains(x))
无论如何,假设list不能有重复项,并且还假设如果在任何时候意外添加了重复项(例如:第二个list.add(1)),则应将其视为错误;如果不需要,我不想添加重复项。
底线是:应该add(int x)抛出一个异常(比如一个IllegalArgumentException或其他东西)?我知道如果我不这样做,我就不需要担心它会导致涉及重复的实际错误,因为它在第二次添加时不会做任何事情,但它仍然让我感到困扰,在某些时候不必要的add()可能叫做。
我见过类似于add(int x)检查某些内容的代码,但基于此不执行任何操作。希望你能把这个想法应用到你以前做过的事情上。
反正我也不知道。我应该在以后的类似问题中继续像上面一样,还是应该抛出异常?
使用以下方式收听"child_added"事件时:
ref.on("child_added", function (snapshot) {
});
Run Code Online (Sandbox Code Playgroud)
对于参考中存在的每个子项,此回调函数最初将运行一次.
此事件将在此位置为每个初始子项触发一次,并且每次添加新子项时都会再次触发该事件.
https://firebase.google.com/docs/reference/node/firebase.database.Reference
我想利用这个事实和排序函数来构造有序数组:
orderedArray = [];
ref.orderByValue("rating").on("child_added", function (snapshot) {
orderedArray.push(snapshot.val())
});
// how do I run a callback after the last child has been added?
Run Code Online (Sandbox Code Playgroud)
但是,(据我所知)没有办法告诉最后一次child_added调用回调,因此在将最后一个子项添加到我的数组后,我无法准确地运行自己的回调.
这是我现在的解决方法:
orderedArray = [];
ref.orderByValue("rating").on("child_added", function (snapshot) {
orderedArray.push(snapshot.val())
});
setTimeout(function() {
ref.off("child_added") // unbind event
callback()
}, 3000)
Run Code Online (Sandbox Code Playgroud)
这非常粗略,特别是在从数据库获取所有数据需要3秒以上的情况下.
这里有什么想法?
我使用Qt 编译了一个最小的代码示例,并注意到链接到其.lib文件添加了我的编译程序链接到其相应.dll文件的要求.
我想为.lib我的其他一个项目创建一个自己,但是想要这样做,而不必.dll为了它必须链接到它.
从这个问题的答案:静态库和共享库之间的区别?
静态库是.a(或Windows .lib)文件.与库相关的所有代码都在此文件中,并在编译时直接链接到程序中.使用静态库的程序从静态库中获取它使用的代码的副本,并使其成为程序的一部分.[Windows也有.lib文件,用于引用.dll文件,但它们的行为方式与第一个相同].
我是否理解有两种类型的.lib文件:
.dll链接).dll用于将对文件的引用添加到已编译的程序中如果这个观察是正确的,那么如何编译.lib其中一种类型呢?
我有兴趣学习Makefile项目的艺术.但是,我有一个问题.
对于后台:在我的计算机上,我已经nmake安装了,我假设在安装它时附带了Visual Studio.我可能正在考虑让我的C++项目使用makefile结构nmake.但是,如果我想转向其他流行的make版本呢?gmake?这引出了我的主要问题:
如果我学习了make(nmake,gmake)的一个实现并转移到另一个实现,我可以在多大程度上预期makefile语法的差异?在惯例/实践中?
如果每个实现之间存在实质性差异,我会有一个后续问题(有点自以为是):
make我应该首先学习哪种实施?为什么?
我的 CMake 项目中的大多数消息都是彩色的。在 Windows 中,颜色仅显示用户是否已ansicon.exe下载,否则打印一个奇怪的字符。因此,我想ansicon在尝试为消息着色之前检查该命令是否存在。
我试图这样做,希望WIN_COLOR能告诉我命令是否存在:
execute_process(
COMMAND "ansicon"
RESULT_VARIABLE WIN_COLOR
)
Run Code Online (Sandbox Code Playgroud)
它确实如此,但它实际上运行 ansicon.exe,它运行命令提示符的新实例,有效地停止配置过程。
有没有更好的办法?我必须最终查看目录吗?
java ×5
cmake ×2
windows ×2
c++ ×1
cmd ×1
coding-style ×1
command ×1
constructor ×1
debugging ×1
dll ×1
firebase ×1
generics ×1
git-bash ×1
gnu-make ×1
javascript ×1
lambda ×1
makefile ×1
maven ×1
nmake ×1
performance ×1
setx ×1
surefire ×1
windows-8.1 ×1