java - 别名对线程安全有什么影响吗?
问题描述
以下代码首先通过向下转换来访问变量,我想知道如果方法的返回类型返回与我正在使用的别名相同的别名(ContainerPieceVolumesBinding binding
)或传入的别名是否有任何区别作为方法参数。
我已经测试了代码,它似乎运行良好,问题是同一变量可能有第二个访问点(第二个访问点是可选的)。
这第二个接入点理论上将使用 viewBind 别名,而不是我在这里使用的向下转换版本。
如果不是返回方法参数抛出的相同别名,而是返回向下转换的版本,会不会有什么不同,会更安全吗?
@SuppressWarnings("unchecked")
@Override
public ViewDataBinding setData(ViewDataBinding viewBind, @NonNull String bindingTag) {
BindingVisitorsBaseAdapter adapter = new BindingVisitorsBaseAdapter(
TAG
);
adapter.setCompletePendingBindings(
pendingBindings
);
//This is the downcasted alias
ContainerPieceVolumesBinding binding = (ContainerPieceVolumesBinding) viewBind;
binding.pieceVolumesContainer.setAdapter(adapter);
observer = new ObjectNotifier(
) {
@Override
public Notifier onNotified() {
return (response, responseType) -> {
switch (responseType) {
case SUBMIT_LIST :
List<BindingVisitor> pieceVolumes = (List<BindingVisitor>) response[0];
((BindingVisitorsBaseAdapter)binding.pieceVolumesContainer.getAdapter()).submitList(pieceVolumes);
break;
case QUANTITY_CHANGE:
onQuantityChanged.onChanged(getValues(binding.pieceVolumesContainer));
break;
}
};
}
};
observer.notifyResponse(SUBMIT_LIST, new ArrayList<>());
// returning the original version here
return viewBind;
}
解决方案
除非您通过对象调用引用静态方法,否则向上转换和向下转换不会对调用的安全性产生影响
public class A {
public void foo() {
System.out.println("A");
}
public static void bar() {
System.out.println("As");
}
}
public class B extends A {
private void foo() {
System.out.println("B");
}
public static void bar() {
System.out.println("Bs");
}
}
A var = new B();
var.foo(); //will print B
var.bar(); //will print A
((B)var).foo(); //will print B
((B)var).bar(); //will print B
推荐阅读
- python - 如何在sqlalchemy模型中获取panrent类中子类的数据?
- javascript - 如何使用颜色选择器动态更改单击元素的颜色
- flutter - 颤动按下后退按钮时如何终止所有正在进行的操作?
- google-apps-script - 如何修复脚本以便我可以将唯一范围复制到另一个选项卡并避免复制列的标题?
- three.js - 如何仅将定向光应用于 Three.js 中的有限区域?
- c# - 如何在 DynamoDB AWS C# SDK 中使用 QueryAsync 和 ScanAsync?
- c# - EF Core 更新外键不会更新导航属性
- r - R - 根据变量删除重复行,但忽略 NA 和一些特定值
- bash - 命令的结果未分配给变量
- matlab - matlab如何测试测量值之间的显着差异?