为什么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 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()方法?
Strategy模式和PolymorphismJava 之间有什么区别?
我很困惑,通过策略模式实现的任何事情基本上都可以通过多态实现.如果我在这方面错了,请纠正我.
请给我一个根除我的困惑的例子.
我正在查看的当前代码库使用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文件时保存了一些状态信息.
好的,我知道抓住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)
这似乎不是那么糟糕?这种方法有什么问题?
考虑用PHP编写的数据库交互模块,其中包含用于与数据库交互的类.我还没有开始编写类,所以我将无法提供代码片段.
每个数据库表将有一个类,如下所述.
User - 用于与用户表交互的类.该类包含createUser,updateUser等函数.
位置 - 用于与位置表交互的类.该类包含searchLocation,createLocation,updateLocation等函数.
另外,我想创建另一个类如下: -
DatabaseHelper:具有表示与数据库的连接的成员的类.该类将包含执行SQL查询的低级方法,如executeQuery(查询,参数),executeUpdate(查询,参数)等.
此时,我有两个选项可以在其他类中使用DatabaseHelper类: -
这些是我很快想到的两种方法.我想知道采用哪种方法.这两种方法都可能不够好,在这种情况下,我想知道我可以用来实现数据库交互模块的任何其他方法.
编辑:
请注意,Container类将包含DatabaseHelper类型的静态成员.它将包含一个私有静态getDatabaseHelper()函数,该函数将返回现有的DatabaseHelper实例或创建一个新的DatabaseHelper实例(如果不存在),在这种情况下,它将填充DatabaseHelper中的连接对象.Container还将包含名为makeUser和makeLocation的静态方法,它们将DatabaseHelper分别注入User和Locations.
在阅读了几个答案之后,我意识到最初的问题几乎已经得到了回答.但在我接受最终答案之前,仍有疑问需要澄清,如下所示.
当我有多个数据库连接到而不是单个数据库时该怎么办.DatabaseHelper类如何包含它以及容器如何在User和Location对象中注入适当的数据库依赖项?
我知道已经发布了类似的问题,虽然我认为我的情况有所不同......
假设您有两种方法:
// 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类型Number或List的亚型的Number.
但毕竟这两种方法有什么区别?
给定以下目录结构:
/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工作.怎么会这样?
我知道这是一个非常基本的问题,但我总是想方设法让我的代码尽可能简洁明了.有没有办法比较一个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) 由于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 ×9
compare ×1
dom ×1
enums ×1
exception ×1
generics ×1
if-statement ×1
import ×1
inheritance ×1
java-8 ×1
javac ×1
jls ×1
package ×1
performance ×1
php ×1
polymorphism ×1
singleton ×1
string ×1