限制只访问必要的数据类访问器/ getter

时间:2014-08-02 11:53:12

标签: java android interface adapter

我有一个在一个类中创建的数据类,可以传递给实现特定接口的几个Android UI活动之一。

每个UI使用相同的数据,但并非所有UI都需要所有数据。我想知道是否有一个简单解决方案,允许每个UI只使用数据的特定部分(仅使用特定的访问者/获取者)

ClickListener处理程序类

// ICalculatorAbstraction is what all my UI's implement. It has method... void updateResult(ExpressionState expression)
public final View.OnClickListener listenerOn(final ICalculatorAbstraction UI) {

    return listener = new View.OnClickListener() {

        @Override
        public void onClick(View v) {

            // Calculations

            ExpressionState expression = new ExpressionState.Builder()
                    .setFirstNumber(num1)
                    .setSecondNumber(num2)
                    .setTotal(total)
                    .setOperator(operator.getSign())
                    .build();

            UI.updateResult(expression); 

        }
    };

}

ICalculatorAbstraction Interface

同样,我的所有Android活动(UI)都实现了这个界面

public interface ICalculatorAbstraction {

    ...

    void updateResult(ExpressionState result);

}

需要所有访问者UI

@Override
public void updateResult(ExpressionState result) {

    String results = String.format( // NOTE: this one needs ALL the accessors / getters!!
            "%s %s %s = %s",
            result.getFirstNumber(),
            result.getOperator(),
            result.getSecondNumber(),
            result.getTotal()
    );

    this.txtResult.setText(results);

需要一个访问者UI

@Override
public void updateResult(ExpressionState result) {

    String results = String.format( // NOTE: this one needs ONE accessor / getter!!
            "Wow. Such Calcuation. %s",
            result.getTotal()

            // NOTE: These should not be allowed in this instance because this UI does not use them
            // result.getFirstNumber()
            // result.getOperator()
            // result.getSecondNumber()

    );

    this.txtResult.setText(results);

如何更改updateResult(...)(在界面和界面中),以便特定用户界面updateResult(...)只允许我使用所需的评估者/获取者?

我尝试创建一个空白界面,然后创建了两个实现该空白界面的抽象类。抽象类只有我需要的访问器/ getter,但是当我尝试修改上面的代码时,没有任何效果。

这可能吗?


更新

以下是我希望看到的内容 - "我最好的解决方案"你可以说。

需要所有访问者UI

@Override
public void updateResult(IAllAccessors result) {

    String results = String.format( 
            "%s %s %s = %s",
            result.getFirstNumber(),
            result.getOperator(),
            result.getSecondNumber(),
            result.getTotal()
    );

    this.txtResult.setText(results);

需要一个访问者UI

@Override
public void updateResult(IOneAccessorOnly result) {

    String results = String.format( 
            "Wow. Such Calcuation. %s",
            result.getTotal()            // I should not be able to do result.getFirstNumber(); for example

    );

    this.txtResult.setText(results);

ExpressionState / Builder Class

public class ExpressionState implements IOneAccessorOnly, IAllAccessors {

    private ExpressionState(Builder builder) { ... }

    public double getFirstNumber() { ... }   // IAllAccessors
    public double getSecondNumber() { ... }  // IAllAccessors
    public String getOperator() { ... }      // IAllAccessors
    public double getTotal() { ... }         // IAllAccessors, IOneAccessorOnly

    public static class Builder { ... }

}

这个解决方案的问题在于,我无法弄清楚如何处理我上面的界面!我没有一个参数可以让编译器对两个UI感到满意。


更新2

我不能......

在使用构建器

创建ClickListener时,在我的ExpressionState课程中
IOneAccessorOnly var = new ExperssionState.Builder()...

这是因为在我的ClickListener课程中,我不知道要创建哪一个。它必须非常通用。在我的用户界面中,我想简化我可以使用的内容。我不能用这种方法做到这一点

因为它不知道该是什么,所以它必须是"一切"

ExpressionState var = new ExpressionState.Builder()...

除此之外,它真的不能是其他任何东西。解决方案必须专门处理UI(活动)以缩小允许的范围!!

1 个答案:

答案 0 :(得分:1)

如果Expression状态是你自己的类,我会让它实现两个不同的接口,如此。

public class ExpressionState implements InterfaceOne, InterfaceTwo {
    public void interfaceOneGetterMethod()
    public void interfaceTwoGetterMethod()
}

在另一个档案中:

public interface InterfaceOne {
    public void interfaceOneGetterMethod();

和最终文件:

public interface InterfaceTwo {
    public void interfaceTwoGetterMethod();

现在,当您创建ExpressionState对象时,将它们分配给定义为的对象:

InterfaceTwo var = new ExperssionState(blah);  

或者修改构建器以返回接口(甚至更好)