gpt4 book ai didi

java - 仅限制对必要的数据类访问器/ getter 的访问

转载 作者:行者123 更新时间:2023-12-01 12:41:04 24 4
gpt4 key购买 nike

我有一个在一个类中创建的数据类,并且可以传递给实现特定接口(interface)的多个 Android UI Activity 之一。

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

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

}
};

}

ICalculator抽象接口(interface)

同样,我的所有 Android Activity (UI) 都实现此接口(interface)

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(...)(在界面和 UI 中),以便特定 UI 的 updateResult(...) 只会让我使用所需的评估器/ setter/getter ?

我尝试创建一个空白接口(interface),然后创建两个实现该空白接口(interface)的抽象类。抽象类只有我需要的访问器/ 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/构建器类

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

我不能...

在使用构建器创建 ExpressionState 时在我的 ClickListener 类中

IOneAccessorOnly var = new ExperssionState.Builder()...

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

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

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

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

最佳答案

如果 Expression state 是您自己的类,我会让它实现两个不同的接口(interface),如下所示。

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

或者修改您的构建器以仅返回接口(interface)(更好)

关于java - 仅限制对必要的数据类访问器/ getter 的访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25094722/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com