13

publicstaticを持つすべてのメソッドを持つユーティリティクラスの正しいアプローチは何ですか。
最終クラスまたは抽象クラスを使用する必要がありますか?
提案をお願いします。
例として:

public final class A{ 
    public static void method(){
        /* ... */
    }
}

また

public abstract class A{
    public static void method(){
        /* ... */
    }
}
4

6 に答える 6

11

abstract独自の目的があります。他のクラス(override)によって実装されるクラス機能の一部が必要な場合は、abstractを使用します。

それが単なるユーティリティクラスであるが、他のクラスがそれをサブクラス化したくない場合は、finalクラスを使用します。ユーティリティクラスにstaticメソッドだけがある場合、それらをオーバーライドすることはできないため、non-finalクラスにそれらを含めることにも違いはありません。

于 2012-09-21T21:36:55.607 に答える
8

ユーティリティクラスを作成するための最良のアプローチ。他のクラスに継承させたくない場合。

//final, because it's not supposed to be subclassed
public final class AlertUtils 
{ 

// private constructor to avoid unnecessary instantiation of the class
    private AlertUtils() {
    }

  public static ..(){}//other methods
}
于 2015-07-09T10:51:47.093 に答える
4

finalここでは、よりも理にかなっていabstractます。クラスをとしてマークすることにより、クラスfinalの拡張を禁止します。一方、abstractサブクラスのない抽象クラスはあまり意味がないため、クラスを一種の反対としてマークします。したがって、拡張されることが期待されます。

于 2012-09-21T21:39:36.600 に答える
3

クラスをfinalにして、プライベートコンストラクターを追加します。(これはクラスがjava.lang.Math使用するようなものです)

public final class A { 
    private A() {}

    public static void method() {
    }
}
于 2015-06-25T20:25:58.173 に答える
1

他のクラスでこのクラスの機能を使用する場合は、抽象化するか、最終版にします。

于 2012-09-21T21:39:04.983 に答える
0

これらは私が見つけたいくつかのガイドラインです:

  • オーバーライドできないように、すべてのメソッドはpublicstaticである必要があります。
  • コンストラクターはプライベートである必要があるため、インスタンス化が防止されます。
  • クラスのfinalキーワードは、サブクラス化を防ぎます。
  • クラスには、非finalまたはnonstaticクラスフィールドを含めることはできません。

あなたが尋ねたように、クラス名は抽象的であってはなりません(お勧めできません)->これはあなたが別のクラスでそれを実装することを計画していることを意味します。サブクラス化を防ぎたい場合は、クラス名にfinalを使用します。インスタンス化を防ぎたい場合は、プライベートコンストラクターを使用してください。

于 2017-03-08T15:45:40.093 に答える