私はちょうど微妙な罠を見つけました。Javaではコンストラクタで抽象メソッドを使用しないでください。
/**
* Innocent-looking example that causes trouble. See {@link B}.
*
*/
public abstract class A {
abstract String someStringLeftForExtensionsToSpecify();
public A() {
super();
processString(someStringLeftForExtensionsToSpecify());
}
void processString(String string) {
// do complicated things with string that are shared by all extensions
// so this could should be here.
}
}
/**
* Looks innocent enough, but abstract method is used in {@link A}'s constructor before
* property is set, even though it uses property.
*/
public class B extends A {
private int property;
public B(int property) {
this.property = property;
}
public String someStringLeftForExtensionsToSpecify() {
if (property == 13) {
return "Unlucky";
}
return "Lucky";
}
}
コンストラクタ内の抽象メソッドを使用すると、OOPのno-noになるはずです。 Javaはこれを禁じるべきではありません、同じ方法で、 "super"への引数として "this"または非静的メソッドの使用を禁じますか?これはよく知られていることだろうか。
'A' **の実際のランタイムインスタンスが**何であるか混乱しています。実行時には、指定されたメソッドを実装する具象型でなければなりません。これが '抽象'型です。 –
これは潜在的な罠なのです。さらに一般的です。非最終的な方法は不可能です。なぜ彼らがそれを許さないのか分からない。おそらく言語の単純さのために、それはちょうど推測です。 – yshavit
NetBeans IDEで警告が表示されます。 –