我從未在任何Java代碼中看到過這種常量聲明...... 所以我想知道是否有任何使用非靜態最終常量的缺點。公開具有非靜態公共最終變量的實例常量
例如,我已經聲明瞭一個Guava函數作爲給定維護模式實例的公共常量。我認爲這樣會更好,因爲如果我創建了一個getDecoratorFunction(),它會每次創建一個新的函數實例...
或者get函數可以返回在類中保持私有的單個實例函數,但它沒用代碼......當我們在類級別聲明常量,我們直接聲明的常量是公開的,我們不把他們的私人,並提供一個公共的getter來訪問它們...
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);
I g如果我的maintenanceMode是可變的並且被多個線程訪問,它可能會導致奇怪的行爲,但這不是。
您是否看到使用這種代碼的缺點?
編輯:我可以有MaintenanceMode的多個實例,並且所有實例都應該能夠根據MaintenanceMode狀態,以提供不同的常數函數。所以我不能使用不會訪問MaintenanceMode狀態的靜態變量。
你可能會覺得有用/有趣的看看這篇文章http://stackoverflow.com/questions/3835283/performance-differences-between-static-and-non-static-final-primitive-fields-in –