この種の定数宣言は、私の周りの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状態にアクセスしない静的変数を使用することはできません。