使用try/catch语句声明和初始化一个final变量

3
我正在尝试在适配器中声明和初始化一个final变量,以便在OnLongClickListener()声明中使用该变量。问题是该变量由一个可能引发失败异常的方法进行初始化,因此初始化必须在try/catch的上下文中进行。在异常块中,有一个备用值被分配给final变量。所有这些都发生在ArrayAdapter<T>的重写getView()中。
我的问题是,有没有一种简洁的方法来解决这个问题?我通过在try/catch外部声明一个临时变量,并在try/catch中初始化它,然后使用临时变量的结果在try/catch块后声明和初始化最终变量来解决了这个问题。但这感觉太混乱了。 这个问题与之非常相关,但所提出的解决方案似乎过于极端。将整个方法的内容包装在try/catch中是否很典型? 代码:
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) Data.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);

//begin eww gross
        Vehicle temp;
        try {
            temp = Data.getVehicle(values.get(position).getId());
        } catch (ObjectNotFoundException e) {
            Log.e(TAG, e.getMessage() + "-- unable to find vehicle while getting list item vehicle for vehicles tab fragment");
            temp = values.get(position);
        }
        final Vehicle vehicle = temp;
//end disappointing, ugly workaround

        ViewHolder holder;
        if (convertView == null) {
            convertView = inflater.inflate(R.layout.vehicle_item_with_img, null);
            holder = new ViewHolder();
            holder.vehicleLabel = (TextView) convertView.findViewById(R.id.vehicle_label);
            holder.statusImage = (ImageView) convertView.findViewById(R.id.lmImageView);
            holder.sImage = (ImageView) convertView.findViewById(R.id.sImageView);
            holder.vehicleTag = vehicle.getId();
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }


        if (Data.isFollowingVehicle(vehicle)) {
            holder.sImage.setVisibility(View.VISIBLE);
        }
        else {
            holder.sImage.setVisibility(View.INVISIBLE);
        }

        holder.statusImage.setImageDrawable(vehicle.getListIcon());
        holder.vehicleLabel.setText(vehicle.getFormattedLabel());

        final ViewHolder finalHolder = holder;
        convertView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                if (!vehicle.isFollowed()) {
                    finalHolder.sImage.setVisibility(View.VISIBLE);
                    mapInterface.follow(vehicle);
                } else {
                    finalHolder.sImage.setVisibility(View.GONE);
                    mapInterface.unfollow(vehicle);
                }
                return false;
            }
        });

        convertView.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                mapInterface.handleVehicleClickFromList(vehicle);
            }
        });

        return convertView;
    }

你会使用 field 吗? - gio
https://docs.oracle.com/javase/tutorial/reflect/member/field.html - gio
@gio 我想我对字段的反射属性还不够熟悉,不知道如何利用它们来解决这个问题。 - nukeforum
1个回答

3

将获取车辆的逻辑移动到自己的方法中是可行的,这样可以使其具有重用性和更易于阅读。

private Vehicle getVehicle(int position) {
    try {
        return Data.getVehicle(values.get(position).getId());
    } catch (ObjectNotFoundException e) {
        Log.e(TAG, e.getMessage() + "-- unable to find vehicle while getting list item vehicle for vehicles tab fragment");
        return values.get(position);
    }
}

然后回到你的原始方法:

final Vehicle vehicle = getVehicle(position);

这很有道理。在接受之前,我会再等一段时间以获取更多答案,但我非常喜欢这个答案。 - nukeforum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接