首页 > 解决方案 > 别名对线程安全有什么影响吗?

问题描述

以下代码首先通过向下转换来访问变量,我想知道如果方法的返回类型返回与我正在使用的别名相同的别名(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;
}

标签: javapointersreferencethread-safetyalias

解决方案


除非您通过对象调用引用静态方法,否则向上转换和向下转换不会对调用的安全性产生影响

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

推荐阅读