1

わかりました、私は絶対に言葉がありません。私は vaadin フレームワークで GUI を構築していますが、それは問題にはなりません。私のコードは次のとおりです。

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);

ここで重要な部分は、最初の readOnly の宣言であり、両方とも最後に出力されます。

true
false

それはどのように可能ですか?ボタンの可視性を設定するために直接クエリを使用できることを意味しますが、それらの値が私には不可能に見えるのが気になります。誰かが説明のアイデアを持っているなら、私に知らせてください。ありがとう

4

2 に答える 2

1

クラス属性readonlyは、オブジェクトがインスタンス化されるときに割り当てられます。

これがアプリケーションの初期化の一部として (ユーザーがサインオンする前にcreateSectionContent) 発生した場合、が呼び出されたときに異なる値になる可能性があります。

ユーザーの状態にアクセスするのにコストがかからないと仮定すると、それを属性として保存するのではなく、isReadOnly()必要に応じてメソッドを呼び出すメソッドを作成することをお勧めします。

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

コストがかかる場合は、遅延初期化します。

于 2013-05-17T08:25:31.367 に答える
1

私の最初の推測は、実行順序です。readOnly が先に割り当てられ、その後状態が変化した可能性があります。

于 2013-05-17T07:40:31.483 に答える