在java中实现基本回调模式,避免创建对象

在java中实现基本回调模式,避免创建对象,java,android,dependency-injection,callback,Java,Android,Dependency Injection,Callback,我已经在Android中实现了一个非常基本的回调模式。 下面是我的代码 接口: public interface OnCustomEventListener{ public void onEvent(); //method, which can have parameters } B班 private OnCustomEventListener mListener; //listener field //setting the listener public void setCu

我已经在Android中实现了一个非常基本的回调模式。 下面是我的代码

接口:

public interface OnCustomEventListener{
    public void onEvent();   //method, which can have parameters
}
B班

private OnCustomEventListener mListener; //listener field

//setting the listener
public void setCustomEventListener(OnCustomEventListener eventListener) {
   this.mListener=eventListener;
}
//当事件触发时-

public void someEventFiringMethod(){
    mListener.onEvent();
}
来自A班-

classB.setCustomEventListener(new OnCustomEventListener(){
    public void onEvent(){
       //do whatever you want to do when the event is performed.
    }
});
这工作得很好,没有问题,但是我觉得这个设计有缺陷- 在这种情况下- 类B定义了侦听器,这意味着任何想要侦听事件的类都必须创建一个新的B对象,然后必须调用该方法。 例如,来自A级-->

与D类/E类类似

B b = new B(); 
b.setCustomEventListener(this); 
有没有办法避免这种情况

并且还假设->B可能依赖于其他几个对象,要创建B,这只会使B的对象创建更加复杂

我知道Dagger2可能是解决依赖关系创建问题的解决方案,但在我的例子中,B类是适配器,a类是Android中的活动。解决上述问题的最佳解决方案是什么?我应该在活动中注入适配器吗?我认为这是一个好方法吗

更新--

public class FoodItemRecyclerView extends RecyclerView.Adapter<FoodItemRecyclerView.ViewHolder> {

    private List<FoodItem> foodList;
    private OnFoodItemEnteredListener foodItemInterface;
    private Context mContext;
    private static final String TAG = "FoodItemRecyclerView";

    public FoodItemRecyclerView(List<FoodItem> foodList, Context context) {
        this.foodList = foodList;
        this.mContext = context;
    }

    public interface OnFoodItemEnteredListener {
        void onFoodItemEntered(String foodItem, int position);
    }

    public void setInterfaceListener(OnFoodItemEnteredListener foodItemInterface){
        this.foodItemInterface = foodItemInterface;
    }

    @NonNull
    @Override
    public FoodItemRecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.item_row, parent, false);

        return new ViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(@NonNull final FoodItemRecyclerView.ViewHolder holder, final int position) {
        holder.edtFoodName.setOnEditorActionListener(new TextView.OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                InputMethodManager imm = (InputMethodManager)mContext.getSystemService(INPUT_METHOD_SERVICE);
                imm.hideSoftInputFromWindow(holder.edtFoodName.getWindowToken(), 0);
                foodItemInterface.onFoodItemEntered(v.getText().toString(),position);
                return true;
            }
        });
    }

    @Override
    public int getItemCount() {
        return foodList.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        private EditText edtFoodName;
        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            edtFoodName = itemView.findViewById(R.id.edtFoodName);
        }
    }

    public void notifyData(List<FoodItem> newFoodList) {
        this.foodList = newFoodList;
        notifyItemInserted(foodList.size() - 1);
    }
}
公共类FoodItemRecyclerView扩展了RecyclerView.Adapter{
私人食品清单;
私有OnFoodItemerListener FoodItemTerface;
私有上下文;
私有静态最终字符串TAG=“FoodItemRecyclerView”;
公共FoodItemRecyclView(列表foodList,上下文){
this.foodList=foodList;
this.mContext=上下文;
}
FoodItemerEdListener上的公共接口{
void onFoodItemered(字符串foodItem,int位置);
}
public void setInterfaceListener(OnFoodItemEnterListener FoodItemTerface){
this.foodItemInterface=foodItemInterface;
}
@非空
@凌驾
public foodItemRecyclServiceView.ViewHolder onCreateViewHolder(@NonNull ViewGroup父级,int-viewType){
View itemView=LayoutInflater.from(parent.getContext())
.充气(R.layout.item_行,父项,假);
返回新的ViewHolder(itemView);
}
@凌驾
public void onBindViewHolder(@NonNull final FoodItemRecyclerView.ViewHolder holder,final int position){
holder.edtFoodName.setOnEditorActionListener(新的TextView.OnEditorActionListener(){
@凌驾
公共布尔onEditorAction(TextView v、int actionId、KeyEvent事件){
InputMethodManager imm=(InputMethodManager)mContext.getSystemService(输入方法服务);
imm.hideSoftInputFromWindow(holder.edtFoodName.getWindowToken(),0);
onFoodItemEnterface.onFoodItemered(v.getText().toString(),位置);
返回true;
}
});
}
@凌驾
public int getItemCount(){
返回foodList.size();
}
公共类ViewHolder扩展了RecyclerView.ViewHolder{
私有EditText-edtFoodName;
公共视图持有者(@NonNull View itemView){
超级(项目视图);
edtFoodName=itemView.findviewbyd(R.id.edtFoodName);
}
}
public void notifyData(列表newFoodList){
this.foodList=newFoodList;
notifyItemInserted(foodList.size()-1);
}
}

这是我的类B,回调返回到活动类A,但是如果我希望回调返回到ViewModel呢?在这种情况下,我不想在ViewModel类中创建adapter的新对象。

请发布更多关于类B的信息。例如,它的职责,是singleton吗?也许,一些额外的代码会有用。此外,我更喜欢避免通过
new
创建实例,因为它很容易导致视图和非视图之间的紧密耦合classes@Steyrix-请检查我上面的代码…在这种情况下,您有什么建议?我建议使用provider,它将知道如何创建适配器,并将此提供程序注入活动。匕首2可以帮你处理。或者您可以使用dagger直接在活动中注入适配器,因为适配器是视图层的一部分,所以它不应该是设计缺陷
public class FoodItemRecyclerView extends RecyclerView.Adapter<FoodItemRecyclerView.ViewHolder> {

    private List<FoodItem> foodList;
    private OnFoodItemEnteredListener foodItemInterface;
    private Context mContext;
    private static final String TAG = "FoodItemRecyclerView";

    public FoodItemRecyclerView(List<FoodItem> foodList, Context context) {
        this.foodList = foodList;
        this.mContext = context;
    }

    public interface OnFoodItemEnteredListener {
        void onFoodItemEntered(String foodItem, int position);
    }

    public void setInterfaceListener(OnFoodItemEnteredListener foodItemInterface){
        this.foodItemInterface = foodItemInterface;
    }

    @NonNull
    @Override
    public FoodItemRecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.item_row, parent, false);

        return new ViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(@NonNull final FoodItemRecyclerView.ViewHolder holder, final int position) {
        holder.edtFoodName.setOnEditorActionListener(new TextView.OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                InputMethodManager imm = (InputMethodManager)mContext.getSystemService(INPUT_METHOD_SERVICE);
                imm.hideSoftInputFromWindow(holder.edtFoodName.getWindowToken(), 0);
                foodItemInterface.onFoodItemEntered(v.getText().toString(),position);
                return true;
            }
        });
    }

    @Override
    public int getItemCount() {
        return foodList.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        private EditText edtFoodName;
        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            edtFoodName = itemView.findViewById(R.id.edtFoodName);
        }
    }

    public void notifyData(List<FoodItem> newFoodList) {
        this.foodList = newFoodList;
        notifyItemInserted(foodList.size() - 1);
    }
}