小编CKi*_*ing的帖子

为什么Thread不是抽象类而start()不是final?

为什么Thread类被实现为常规类而不是抽象类,run()方法是抽象的.

它可能会引入任何问题吗?或者以这种方式有用吗?

此外,该Thread.start()方法应该是一个非常具体的方法,其功能不能由任何其他类实现(如果我没有错).因此我猜这个final关键字比任何其他方法更适合这个.

但是我可以覆盖这个方法并按我喜欢的方式使用它,

public class Test extends Thread {
    public static void main (String... args) {
        Thread test = new Test();
        test.start();
    }

    @Override
    public void run() {
        System.out.println("New thread started...");
    }

    @Override
    public void start() {
        System.out.println("Did anyone tell you I will spawn a new thread??");
    }
}
Run Code Online (Sandbox Code Playgroud)

它显然只是印刷,

有没有人告诉你我会产生一个新线程?

除了混淆工程师取代你之外,是否有任何超越的用途?

如果没有,为什么这个方法在Thread类中没有声明为final?

java multithreading

73
推荐指数
3
解决办法
6526
查看次数

Java 8使用枚举的方式

我想知道Java 8中最好的方法是使用枚举的所有值.特别是当你需要获取所有值并将其添加到某个地方时,例如,假设我们有以下枚举:

public enum Letter {
 A, B, C, D;
}
Run Code Online (Sandbox Code Playgroud)

我当然可以做以下事情:

for (Letter l : Letter.values()) {
    foo(l);
}
Run Code Online (Sandbox Code Playgroud)

但是,我还可以在枚举定义中添加以下方法:

public static Stream<Letter> stream() {
    return Arrays.stream(Letter.values());
}
Run Code Online (Sandbox Code Playgroud)

然后用以下内容替换上面的for:

Letter.stream().forEach(l -> foo(l));
Run Code Online (Sandbox Code Playgroud)

这种方法是正确的还是在设计或性能方面有问题?而且,为什么enums没有stream()方法?

java enums java-8

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

多态性与策略模式

Strategy模式和PolymorphismJava 之间有什么区别?

我很困惑,通过策略模式实现的任何事情基本上都可以通过多态实现.如果我在这方面错了,请纠正我.

请给我一个根除我的困惑的例子.

java polymorphism design-patterns strategy-pattern

40
推荐指数
5
解决办法
8944
查看次数

DocumentBuilder线程安全吗?

我正在查看的当前代码库使用DOM解析器.以下代码片段在5种方法中重复:

 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
 DocumentBuilder builder = factory.newDocumentBuilder();
Run Code Online (Sandbox Code Playgroud)

如果在循环中调用包含上述代码的方法,或者在应用程序中多次调用该方法,那么我们将承担为每次调用此类方法创建新的DocumentBuilderFactory实例和新的DocumentBuilder实例的开销.

在DocumentBuilder工厂和DocumentBuilder实例周围创建一个单独的包装器是一个好主意,如下所示:

public final class DOMParser {
   private DocumentBuilderFactory = new DocumentBuilderFactory();
   private DocumentBuilder builder;

   private static DOMParser instance = new DOMParser();

   private DOMParser() {
      builder = factory.newDocumentBuilder();
   }

   public Document parse(InputSource xml) {
       return builder.parser(xml);
   }
}
Run Code Online (Sandbox Code Playgroud)

如果上述单例在多个线程之间共享,是否会出现任何问题?如果没有,通过在应用程序的整个生命周期中使用上述创建DocumentBuilderFactory和DocumentBuilder实例的方法,是否会有任何性能提升?

编辑:

我们唯一能遇到问题的是,如果DocumentBuilder在解析可能影响解析下一个XML文件的XML文件时保存了一些状态信息.

java performance singleton multithreading dom

36
推荐指数
2
解决办法
3万
查看次数

捕获throwable并处理特定异常

好的,我知道抓住throwable不是一个好主意:

    try {
         // Some code
    } catch(Throwable e) { // Not cool!
        // handle the exception
    }
Run Code Online (Sandbox Code Playgroud)

但最近我正在阅读一个开源代码,我看到了这段有趣的代码(至少对我而言):

    try {
        // Some Code
    } catch (Throwable ex){
        response = handleException(ex, resource);
    }

    private handleException(Throwable t, String resource) {
        if (t instanceof SQLEXception) {
               // Some code
        } else if (t instanceof IllegalArgumentException) {
               //some code
        } //so on and so forth
    }
Run Code Online (Sandbox Code Playgroud)

这似乎不是那么糟糕?这种方法有什么问题?

java exception-handling exception

23
推荐指数
3
解决办法
8412
查看次数

构成与继承.我应该将什么用于我的数据库交互库?

考虑用PHP编写的数据库交互模块,其中包含用于与数据库交互的类.我还没有开始编写类,所以我将无法提供代码片段.

每个数据库表将有一个类,如下所述.

User - 用于与用户表交互的类.该类包含createUser,updateUser等函数.

位置 - 用于与位置表交互的类.该类包含searchLocation,createLocation,updateLocation等函数.

另外,我想创建另一个类如下: -

DatabaseHelper:具有表示与数据库的连接的成员的类.该类将包含执行SQL查询的低级方法,如executeQuery(查询,参数),executeUpdate(查询,参数)等.

此时,我有两个选项可以在其他类中使用DatabaseHelper类: -

  1. User和Locations类将扩展DatabaseHelper类,以便它们可以使用DatabaseHelper中继承的executeQuery和executeUpdate方法.在这种情况下,DatabaseHelper将确保在任何给定时间只有一个连接到数据库的实例.
  2. DatabaseHelper类将通过将创建User和Location实例的Container类注入User和Locations类.在这种情况下,Container将确保在任何给定时间应用程序中只有一个DatabaseHelper实例.

这些是我很快想到的两种方法.我想知道采用哪种方法.这两种方法都可能不够好,在这种情况下,我想知道我可以用来实现数据库交互模块的任何其他方法.

编辑:

请注意,Container类将包含DatabaseHelper类型的静态成员.它将包含一个私有静态getDatabaseHelper()函数,该函数将返回现有的DatabaseHelper实例或创建一个新的DatabaseHelper实例(如果不存在),在这种情况下,它将填充DatabaseHelper中的连接对象.Container还将包含名为makeUser和makeLocation的静态方法,它们将DatabaseHelper分别注入User和Locations.

在阅读了几个答案之后,我意识到最初的问题几乎已经得到了回答.但在我接受最终答案之前,仍有疑问需要澄清,如下所示.

当我有多个数据库连接到而不是单个数据库时该怎么办.DatabaseHelper类如何包含它以及容器如何在User和Location对象中注入适当的数据库依赖项?

php inheritance dependency-injection

18
推荐指数
3
解决办法
3121
查看次数

有界类型参数与上限通配符的区别

我知道已经发布了类似的问题,虽然我认为我的情况有所不同......

假设您有两种方法:

// Bounded type parameter
private static <T extends Number> void processList(List<T> someList) {

}

// Upper bound wildcard
private static void processList2(List<? extends Number> someList) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

据我所知,这两种方法接受参数,是List类型NumberList亚型Number.

但毕竟这两种方法有什么区别?

java generics bounded-types bounded-wildcard

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

javac如何自动编译类的依赖关系

给定以下目录结构:

/top
   |--- wrk
          |--- pkg
                  |--- A.java
                  |--- B.java
Run Code Online (Sandbox Code Playgroud)

假设两个文件A.java,并B.java包含下面的代码,分别为:

// Filename: A.java
package pkg;
class A { B b; }

// Filename: B.java
package pkg;
class B {...}
Run Code Online (Sandbox Code Playgroud)

假设当前目录是 /top/wrk

为什么javac -cp . pkg/A.java即使我们还没有编译,命令也能成功运行B.java

此外,如果当前目录是/top/wrk/pkg命令javac A.java工作.怎么会这样?

java import javac package

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

检查Java中三个或更多字符串的相等性

我知道这是一个非常基本的问题,但我总是想方设法让我的代码尽可能简洁明了.有没有办法比较一个if()语句中三个或更多字符串的相等性?我目前正在使用&&运算符逐步比较每个字符串.但是,正如您可以想象的那样,在调用长变量名和方法之间,这些if()语句会非常快速地混乱.另外,我计划使用未知数量的这些字符串,并且希望避免复杂的for循环,其中if()嵌套了混乱的字符串.这是我的代码目前的样子:

String a = new String("a");
String b = new String("b");
String c = new String("c");
if(a.equals(b) && b.equals(c)) {
    doSomething();
}
Run Code Online (Sandbox Code Playgroud)

有没有办法,或者我可以使用某种类型的集合,这样我就可以比较这些值:

if(a.equals(b).equals(c)) {
    doSomething();
}
Run Code Online (Sandbox Code Playgroud)

java string if-statement compare

12
推荐指数
2
解决办法
2万
查看次数

为什么对隐藏的静态方法强制执行返回类型协方差?

由于in 的String返回类型,此代码将无法编译.staticMethodChild

class Parent {
    static void staticMethod() {    
    }
}

class Child extends Parent {
    static String staticMethod() {
        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

我知道§8.4.8.3中的JLS 8,"覆盖和隐藏的要求"说:

如果具有返回类型R1的方法声明d1覆盖或隐藏具有返回类型R2的另一个方法d2的声明,则对于d2,d1必须是return-type-substitutable(第8.4.5节),否则会发生编译时错误.

我的问题是在静态方法的特定情况下进行编译时检查的动机是什么,这个例子说明在编译期间未能进行此验证会产生任何问题是理想的.

java jls

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