2013-05-17 56 views
1

好吧,我完全無語。我正在用vaadin框架構建一個GUI,但這對問題應該沒有關係。我的繼承人代碼:布爾var具有不同的值,然後查詢填充它?

private final boolean readOnly = GenericAdapterFrontendApplication 
     .getInstance().getUserRole().equals(UserRole.READ); 

public InstitutionDetailMasterData(Institution i) { 
    super(i); 
} 

protected void createSectionContent(Institution i, Panel p) { 
    p.addComponent(createRow(
      ViewUtils.getMessage("view.institut.masterdata." + PROP_NAME), 
      i.getName())); 
    p.addComponent(createRow(
      ViewUtils.getMessage("view.institut.masterdata." 
        + PROP_DEUBA_ID), i.getDeubaId())); 
    p.addComponent(createRow(ViewUtils 
      .getMessage("view.institut.masterdata." + PROP_VARIANT), i 
      .getVariant().toString())); 
    p.addComponent(createRow(
      ViewUtils.getMessage("view.institut.masterdata." 
        + PROP_FIELD_SEP), i.getFieldSeparator())); 
    p.addComponent(createRow(
      ViewUtils.getMessage("view.institut.masterdata." 
        + PROP_RECORD_SEP), i.getRecordSeparator())); 
    p.addComponent(createRow(
      ViewUtils.getMessage("view.institut.masterdata." 
        + PROP_DATE_FORMAT), i.getDateFormat())); 
    p.addComponent(createRow(
      ViewUtils.getMessage("view.institut.masterdata." 
        + PROP_DECIMAL_SEP), i.getDecimalSeparator())); 
    p.addComponent(createRow(
      ViewUtils.getMessage("view.institut.masterdata." 
        + PROP_THOUSAND_SEP), i.getThousandSeparator())); 
    p.addComponent(createRow(ViewUtils 
      .getMessage("view.institut.masterdata." + PROP_QUOTING), i 
      .getQuoting())); 
    p.addComponent(createRow(
      ViewUtils.getMessage("view.institut.masterdata." 
        + PROP_FREQUENCY), i.getFrequency())); 
    System.out.println(GenericAdapterFrontendApplication 
      .getInstance().getUserRole().equals(UserRole.READ)); 
    System.out.println(this.readOnly); 
    editButton.setVisible(!this.readOnly); 

現在重要的部分是隻讀的在開始和兩個打印ATH結束的聲明,因爲你的打印:

true 
false 

這怎麼可能呢?我的意思是我可以使用直接查詢來設置按鈕的可見性,但它讓我感到困擾,那些值對我來說似乎是不可能的。如果有人有解釋的想法,請讓我知道。 謝謝

+2

值可能在運行時改變?成員變量聲明將在類實例化時分配,而println語句中的值將在每次調用該方法時進行評估。根據這個框架中的對象生命週期,也許你的類在GenericAdapterFrontendApplication被正確設置使用之前實例化。 –

回答

1

當實例化對象時,會分配類屬性readonly

如果這是作爲應用程序初始化的一部分發生的 - 之前用戶已經登錄 - 當調用createSectionContent時,它可能具有不同的值。

假設訪問用戶的狀態並不昂貴,我建議您不要將其存儲爲屬性,而應創建一個按需調用方法的方法,例如,

protected boolean isReadOnly(){ 
    return GenericAdapterFrontendApplication.getInstance().getUserRole().equals(UserRole.READ); 
} 

如果代價高昂,請將其初始化。

+0

是的,我認爲就是這樣。所以我會改變它到isReadOnly() - 像你說的方法或通過UserRole作爲參數,我會看到。 謝謝,eyerybody! – olkoza

1

我的第一個猜測是執行順序。 readOnly被分配的更早,並且狀態可能在此之後被更改。