小编oct*_*pod的帖子

性能:我应该避免构造函数委派吗?

我想知道在构造函数(也就是构造函数委托)中运行构造函数之间是否存在任何性能差异.

请不要将此问题解释为支持冗余,例如复制长构造函数以提高性能.据我所知,在大多数情况下,除了性能之外,还需要在构造函数中调用构造函数.(例如,可读性)

例如,这是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)

java performance constructor

15
推荐指数
3
解决办法
917
查看次数

有没有办法在lambda表达式中显式定义泛型参数类型?

我这里有一个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)

java generics lambda

9
推荐指数
1
解决办法
1067
查看次数

使用Intellij IDEA构建项目时,Maven Surefire插件"启动叉错误"

我正在尝试使用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)

java intellij-idea surefire maven

7
推荐指数
1
解决办法
4344
查看次数

当只有两个参数时,具有两个以上参数的"setx"语法无效

我无法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永久地设置全局环境变量.(需要管理员访问权限)

cmd environment-variables setx windows-8.1

6
推荐指数
1
解决办法
1万
查看次数

为什么 Git Bash 不使用 PATH 环境变量中定义的正确 Java 路径?

在 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)

java windows git-bash

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

根据条件使方法“什么都不做”是一个好习惯吗?

看看这个:

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)检查某些内容的代码,但基于此不执行任何操作。希望你能把这个想法应用到你以前做过的事情上。

反正我也不知道。我应该在以后的类似问题中继续像上面一样,还是应该抛出异常?

java debugging coding-style

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

Firebase:如何在所有初始"child_added"调用之后运行回调?

使用以下方式收听"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秒以上的情况下.

这里有什么想法?

javascript firebase firebase-realtime-database

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

是否有不同类型的.lib文件?

我使用Qt 编译了一个最小的代码示例,并注意到链接到其.lib文件添加了我的编译程序链接到其相应.dll文件的要求.

我想为.lib我的其他一个项目创建一个自己,但是想要这样做,而不必.dll为了它必须链接到它.


从这个问题的答案:静态库和共享库之间的区别?

静态库是.a(或Windows .lib)文件.与库相关的所有代码都在此文件中,并在编译时直接链接到程序中.使用静态库的程序从静态库中获取它使用的代码的副本,并使其成为程序的一部分.[Windows也有.lib文件,用于引用.dll文件,但它们的行为方式与第一个相同].

我是否理解有两种类型的.lib文件:

  • 将其中的代码复制到已编译的程序中的类型(不需要.dll链接)
  • 一种类型,.dll用于将对文件的引用添加到已编译的程序中

如果这个观察是正确的,那么如何编译.lib其中一种类型呢?

c++ dll static-libraries

2
推荐指数
1
解决办法
1129
查看次数

学习Makefile:Make的所有实现中的规则是否通用?

我有兴趣学习Makefile项目的艺术.但是,我有一个问题.

对于后台:在我的计算机上,我已经nmake安装了,我假设在安装它时附带了Visual Studio.我可能正在考虑让我的C++项目使用makefile结构nmake.但是,如果我想转向其他流行的make版本呢?gmake?这引出了我的主要问题:

如果我学习了make(nmake,gmake)的一个实现并转移到另一个实现,我可以在多大程度上预期makefile语法的差异?在惯例/实践中?

如果每个实现之间存在实质性差异,我会有一个后续问题(有点自以为是):

make我应该首先学习哪种实施?为什么?

nmake makefile cmake gnu-make

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

有没有办法在不使用 CMake 运行的情况下检查 ansicon.exe 是否存在?

我的 CMake 项目中的大多数消息都是彩色的。在 Windows 中,颜色仅显示用户是否已ansicon.exe下载,否则打印一个奇怪的字符。因此,我想ansicon在尝试为消息着色之前检查该命令是否存在。

我试图这样做,希望WIN_COLOR能告诉我命令是否存在:

execute_process(
    COMMAND "ansicon"
    RESULT_VARIABLE WIN_COLOR
)
Run Code Online (Sandbox Code Playgroud)

它确实如此,但它实际上运行 ansicon.exe,它运行命令提示符的新实例,有效地停止配置过程。

有没有更好的办法?我必须最终查看目录吗?

windows command cmake console-application

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