簡體   English   中英

使用try / catch聲明並初始化最終變量

[英]Using try/catch to declare and initialize a final variable

我正在嘗試聲明並初始化適配器中的最終變量,以便在OnLongClickListener()聲明中使用該變量。 問題是變量正在被一個可能引發失敗異常的方法初始化,因此初始化必須在try / catch的上下文中進行。 在異常塊中,有一個回退值,而是指定最終變量。 這一切都發生在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;
    }

可以移動邏輯以使Vehicle進入自己的方法。 它使它可重復使用,更易於閱讀。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM