-1

インターフェイス自体に定数を格納したくないという調査を行っていたので、列挙型などの代替手段を探していましたが、別のアプローチとして、インターフェイスを使用する代わりに、finalを使用することがわかりました。プライベートコンストラクターを持つクラス。(クラスのインスタンス化またはサブクラス化を不可能にし、非静的機能/データが含まれていないという強力なメッセージを送信します。その場合、静的インポートを利用することもできます。

Public final class KittenConstants
{
    private KittenConstants() {}

    public static final String KITTEN_SOUND = "meow";
    public static final double KITTEN_CUTENESS_FACTOR = 1;
}

2つの独立したもの。1:継承を悪用する代わりに静的インポートを使用します。2:定数リポジトリが必要な場合は、インターフェースではなく最終クラスにします。このアプローチが正しいことをアドバイスしてください..!!

定数インターフェイスのいくつかの落とし穴を回避するには(人々がそれを実装するのを防ぐことができないため)、プライベートコンストラクターを持つ適切なクラスを優先する必要があります(例:ウィキペディアから借用):

public final class Constants {

private Constants() {
    // restrict instantiation
}

public static final double PI = 3.14159;
public static final double PLANCK_CONSTANT = 6.62606896e-34;
}

また、定数を完全に修飾せずに(つまり、クラス名のプレフィックスを付けずに)定数にアクセスするには、静的インポートを使用します(Java 5以降)。

import static Constants.PLANCK_CONSTANT;
import static Constants.PI;

public class Calculations {

    public double getReducedPlanckConstant() {
        return PLANCK_CONSTANT / (2 * PI);
    }
}

列挙型でも同じことができる方法を示してください..!

4

2 に答える 2

2

列挙型を介して「定数」を達成できます。

public enum Animal {
    Kitten("meow", 1),
    Puppy("woof", 2);

    private final String sound;
    private final double cuteness;

    Animal (String sound, double cuteness) {
        this.sound = sound;
        this.cuteness = cuteness;
    }

    public String getSound() {
        return sound;
    }

    public double getCuteness() {
        return cuteness;
    }
}

使用するには:

String sound = Animal.Kitten.getSound();
double cuteness = Animal.Kitten.getCuteness();
于 2012-08-21T04:09:45.443 に答える
1

簡単な答えは、でそれを行うことはできないということですenum列挙型は、同じタイプの関連する定数のセットを定義します。

このKittenConstants場合、基本的に異なるタイプの定数のセットがあります。enumこれはモデルに適合しません。(問題を少し変更する場合。たとえば、さまざまな種類のSFAを一般化することで、@ Bohemianのように適合させることができます...しかし、それが達成しようとしているものでない場合はenum、適切な解決策ではありません。 )。

このConstants場合、値として使用する名前付き浮動小数点定数の束があります。enum(すべて同じタイプ...これは役に立ちます!)これで、次のように宣言できます。

    public enum Constants {
        PLANCK_CONSTANT(6.62606896e-34),
        PI(3.14.59);

        public final double value;

        Constants(double value) {this.value = value);
    }

問題は、名前付き定数の数値にアクセスするには「.value」を使用する必要があるということです。例えば

    import static Constants.*;
    ....
    public double getReducedPlanckConstant() {
        return PLANCK_CONSTANT.value / (2 * PI.value);
    }

....これはちょっと醜いです、そして私は醜さを回避する方法はないと思います。

結論-列挙型は、あらゆる種類の定数の理想的な代替ではありません。

于 2012-08-21T04:35:47.767 に答える