1

この種の定数宣言は、私の周りのJavaコードでは見たことがありません...したがって、非静的な最終定数を使用することの欠点があるかどうかを知りたいと思います。

たとえば、Guava関数を特定のMaintenanceModeインスタンスのパブリック定数として宣言しました。getDecoratorFunction()を作成すると、毎回新しい関数インスタンスが作成されるため、より良いと思います...

または、get関数は、クラスでプライベートに保たれている単一インスタンス関数を返すことができますが、それは役に立たないコードを持っていました...クラスレベルで定数を宣言するとき、定数がパブリックであることを直接宣言し、プライベートにせずに提供しますそれらにアクセスするためのパブリックゲッター...

public class MaintenanceMode {

/**
 * Provides a function to decorate a push service with the appropriate decorator
 */
public final Function<PushService,PushService> MAINTENANCE_DECORATION_FUNCTION = new Function<PushService,PushService>() {
    @Override
    public PushService apply(PushService serviceToDecorate) {
        return new PushServiceMaintenanceDecorator(serviceToDecorate,MaintenanceMode.this);
    }
};

private final EnumMaintenanceMode maintenanceMode;
private final long milliesBetweenMaintenances;
private final Optional<ExecutorService> executorService;


public EnumMaintenanceMode getMaintenanceMode() {
    return maintenanceMode;
}

public long getMilliesBetweenMaintenances() {
    return milliesBetweenMaintenances;
}

public Optional<ExecutorService> getExecutorService() {
    return executorService;
}


private MaintenanceMode(EnumMaintenanceMode maintenanceMode, long milliesBetweenMaintenances, ExecutorService executorService) {
    Preconditions.checkArgument(maintenanceMode != null);
    Preconditions.checkArgument(milliesBetweenMaintenances >= 0);
    this.maintenanceMode = maintenanceMode;
    this.milliesBetweenMaintenances = milliesBetweenMaintenances;
    this.executorService = Optional.fromNullable(executorService);
}

}

そして、私はこの変数にアクセスできます:

  pushServiceRegistry.decoratePushServices(maintenanceMode.MAINTENANCE_DECORATION_FUNCTION);

私のmaintenanceModeが可変であり、複数のスレッドによってアクセスされた場合、奇妙な動作につながる可能性があると思いますが、ここではそうではありません。

この種のコードを使用することの欠点はありますか?


編集: MaintenanceModeの複数のインスタンスを持つことができ、すべてのインスタンスは、MaintenanceModeの状態に応じて異なる定数関数を提供できるはずです。したがって、MaintenanceMode状態にアクセスしない静的変数を使用することはできません。

4

2 に答える 2

2

ゲッターのポイントは、動的ディスパッチです。それが必要ない場合は、public finalフィールドを使用することはまったく問題ありません。ゲッターがなく、public finalフィールドだけのBeanのようなオブジェクトを日常的に作成しています。

于 2012-09-03T13:22:55.890 に答える
1

定数を非静的にすることで、基本的に、そのクラスのインスタンスがある場合にのみ定数にアクセスできると言っています。しかし、それは公開されており(の場合MAINTENANCE_DECORATION_FUNCTION)、そのクラスの一部なので、静的にしないのはなぜですか?結局のところ、定数は定数であり、そのクラスのインスタンスを他の場所で使用する必要はありません。変数maintenanceModeはプライベート定数なので問題ありません。

于 2012-09-03T13:18:28.000 に答える