2012-09-03 52 views
1

我從未在任何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狀態的靜態變量。

+0

你可能會覺得有用/有趣的看看這篇文章http://stackoverflow.com/questions/3835283/performance-differences-between-static-and-non-static-final-primitive-fields-in –

回答

2

吸氣劑的要點是動態分配。如果你不需要它,那麼使用public final字段就很好。我甚至經常編寫沒有getter的類似bean的對象,只有public final字段。

1

通過使一個常量非靜態,你基本上說只有當你有一個該類的實例才能訪問該常量。但它是公開的(在MAINTENANCE_DECORATION_FUNCTION的情況下),它是該類的一部分,爲什麼不把它設爲靜態?畢竟,常量是一個常量,它不需要在其他地方使用該類的實例。變量maintenanceMode很好,因爲它是一個私有常量。

+0

其實,我可以有多個MaintenanceMode實例,它們都應該提供一個不同的常量函數。這就是爲什麼我沒有把變量變成靜態的,因爲它在課堂上沒有意義。 –