如何快速把握一个类

Java学习方法(一)—如何快速掌握一个 陌生class

一、序言

任何一个用Java语言开发的项目,都是由很多后缀为 .java 的文件构成。对于一个庞大的Java项目开发,通常都会由几百,甚至上千人来协同完成。

假如你正在一个 Person.java的文件中,给这个 Person 类写一个方法,然而,要完成这个方法,必须用到另一个class C 的属性或者方法。那么问题来了,class C 这个类并不是你写的,而且还代码量还不小,更恶心的是,这个class类的代码居然还没写注释。当我们拿到这个类的时候,对于很多新手来说,简直就是懵逼了!

想要用它,或者,想去了解它的一些实现原理,但是又无从下手!常常都是一头扎进类的方法中,一行一行的研究,结果陷了进去,出不来。

相信每个人都会遇到过这种情况,那么要怎么样才能快速掌握一个class的用途呢,也就是说,我们怎么能快速的清楚,这个类是用来做什么的,都有些什么功能。比如:实现网络访问,数据解析,还是数据检验等。通常一个类都会携带好几种功能。

人生一切皆套路,套路得人心!

二、 相关知识

如何快速的分析一个类呢?这当然也是有套路的。磨刀不误砍柴工,在做之前,我们还需要先总结一下 类 的相关知识。

2.1 类的三要素

我们每天都在不断的写各种各样的类,不知道大家有没有想过这么个问题,怎么样才算一个标准的类呢?

通常一个类都会包含:属性、构造器和方法。也就是说,如果一个类,有了这三要素,那么可以说,这是一个标准的class了。
那么,如果我们想要快速地掌握一个类,就得从这三要素着手了。

或许有同学会说,我们实际中的类,不止那么那么简单啊,里面可能会有内部类,局部内部类、局部变量,甚至匿名内部类等等。
还有另一种同学会说,一个class只要有了 构造器 已经算是一个类了。为毛一定要三要素,才算标准的类。
对于上面的两种孩童,小编只能说,你俩赶紧洗洗睡吧。咱们没有共同语言。

学习编程最重要的是什么—编程思想。那么什么是编程思想呢?用土话来说,实际上就是:套路。为什么这么说呢?因为任何东西都不是凭空而生的,编程经过上百年的发展,浓缩了先辈们的智慧,如果我们成天想着把所有的原理都搞通透,那先辈们,还玩个卵!你要明白—你就是一个普通人。一个需要养家糊口的的普通人。

所以当我们接触一种新的事物,都会有一个固定的过程:

第一阶段:学习它的使用方法

也就是这玩意怎么用。比如:当我们手动实践或者是分析,它的某项功能时,最好同时在草纸上简要的写一些操作流程,这样我们就能做到心中有数。不至于学的东西一多就混乱。这个阶段一定要保持心态,重在多练习。急不来,也不要想太多。

第二阶段:做一个总结

很不辛,在大多数的公司,因为要赶项目,所以是不会有大多的时间,给你进行第一阶段的深入学习,基本都是囫囵吞枣,就要上项目了。特别是事情一多,你就要懵逼了。 所以这一阶段,实施的策略都是—-用到了,就去查,然后照搬操作步骤。同时这一阶段的目标也只会有一个:那就是解决问题。至于解决问题的过程中,有什么疑问、或者不理解的地方,这就要靠个人的随手记录,业余时间去搞懂,然后总结了。通常这也是工资高低的一个分水岭。

第三阶段:架构层次的把握

相信第二阶段都能做到的同学,基本上都会对自己负责的项目或者模块的内容了如指掌。相信这时候,你们已经能感觉到软件的开发中一个朦胧的黑手。感觉就像一只黑手在操纵着一切。没错,那就是软件编程中的另一个思想—架构层次。也就是说,我们软件开发或者学习中,一定不要一头扎进一个点,然后陷了进去,出不来。到时候,只见树木,不见森林。 这一点,同样是适用于我们生活中的每一件事的。

好了,估计大家都不耐烦了。咱们还是说套路吧。

三、快速把握一个类的技巧

人生处处是套路!!!

Java编程中,通常使用的是 eclipse 软件。但小编是做Android开发的,下面我们就使用android studio 来讲解,一些技巧。

在开始之前,先给大家贴一个class类。

package cn.bmob.sdkdemo.permission;

import android.app.Activity;
import android.content.pm.PackageManager;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.Fragment;
import android.support.v4.content.ContextCompat;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 权限管理
 * @author
 * @class PermissionManager
 * @date 2016-3-25 下午3:54:14
 */
public class PermissionManager {

private Object mObject;
private String[] mPermissions;
private int mRequestCode;
private PermissionListener mListener;
// 用户是否确认了解释框的
private boolean mIsPositive = false;

public static PermissionManager with(Activity activity) {
    return new PermissionManager(activity);
}

public static PermissionManager with(Fragment fragment) {
    return new PermissionManager(fragment);
}

public PermissionManager permissions(String... permissions) {
    this.mPermissions = permissions;
    return this;
}

public PermissionManager addRequestCode(int requestCode) {
    this.mRequestCode = requestCode;
    return this;
}

public PermissionManager setPermissionsListener(PermissionListener listener) {
    this.mListener = listener;
    return this;
}

public PermissionManager(Object object) {
    this.mObject = object;
}

/**请求权限
 * @return PermissionManager
 */
public PermissionManager request() {
    request(mObject, mPermissions, mRequestCode);
    return this;
}

private void request(Object object, String[] permissions, int requestCode) {
    // 根据权限集合去查找是否已经授权过
    Map<String, List<String>> map = findDeniedPermissions(getActivity(object), permissions);
    List<String> deniedPermissions = map.get("deny");
    List<String> rationales = map.get("rationale");
    if (deniedPermissions.size() > 0) {
        // 第一次点击deny才调用,mIsPositive是为了防止点确认解释框后调request()递归调onShowRationale
        if (rationales.size() > 0 && mIsPositive == false) {
            if (mListener != null ) {
                mListener.onShowRationale(rationales.toArray(new String[rationales.size()]));
            }
            return;
        }
        if (object instanceof Activity) {
            ActivityCompat.requestPermissions((Activity) object, deniedPermissions.toArray(new String[deniedPermissions.size()]), requestCode);
        } else if (object instanceof Fragment) {
            ((Fragment) object).requestPermissions(deniedPermissions.toArray(new String[deniedPermissions.size()]), requestCode);
        } else {
            throw new IllegalArgumentException(object.getClass().getName() + " is not supported");
        }
    } else {
        if (mListener != null) {
            mListener.onGranted();
        }
    }
}

/**根据requestCode处理响应的权限
 * @param permissions
 * @param results
 */
public void onPermissionResult(String[] permissions, int[] results) {
    List<String> deniedPermissions = new ArrayList<String>();
    for (int i = 0; i < results.length; i++) {
        if (results[i] != PackageManager.PERMISSION_GRANTED) {//未授权
            deniedPermissions.add(permissions[i]);
        }
    }
    if (deniedPermissions.size() > 0) {
        if (mListener != null) {
            mListener.onDenied();
        }
    } else {
        if (mListener != null) {
            mListener.onGranted();
        }
    }
}

private Map<String, List<String>> findDeniedPermissions(Activity activity, String... permissions) {
    Map<String, List<String>> map = new HashMap<String, List<String>>();
    List<String> denyList = new ArrayList<String>();//未授权的权限
    List<String> rationaleList = new ArrayList<String>();//需要显示提示框的权限
    for (String value : permissions) {
        if (ContextCompat.checkSelfPermission(activity, value) != PackageManager.PERMISSION_GRANTED) {
            denyList.add(value);
            if (shouldShowRequestPermissionRationale(value)) {
                rationaleList.add(value);
            }
        }
    }
    map.put("deny", denyList);
    map.put("rationale", rationaleList);
    return map;
}

private Activity getActivity(Object object) {
    if (object instanceof Fragment) {
        return ((Fragment) object).getActivity();
    } else if (object instanceof Activity) {
        return (Activity) object;
    }
    return null;
}

/**
 * 当用户拒绝某权限时并点击就不再提醒的按钮时,下次应用再请求该权限时,需要给出合适的响应(比如给个展示对话框)
 * @param permission
 */
private boolean shouldShowRequestPermissionRationale(String permission) {
    if (mObject instanceof Activity) {
        return ActivityCompat.shouldShowRequestPermissionRationale((Activity) mObject, permission);
    } else if (mObject instanceof Fragment) {
        return ((Fragment) mObject).shouldShowRequestPermissionRationale(permission);
    } else {
        throw new IllegalArgumentException(mObject.getClass().getName() + " is not supported");
    }
}

public void setIsPositive(boolean isPositive) {
    this.mIsPositive = isPositive;
}
}

当我们拿到这个类的时候,估计大家都会懵逼。下面我们就要使用大招!!。

3.1 大招一:缩放

请看,结构层次是不是很清晰。类的三要素,马上出来了。这样子我们就可以初步的把握,这个类的所有资源。有多少个属性(也就是成员变量)。有多少个方法。同时,我们还可以见名知意,初步了解每一个方法的大概功能。

缩放,它的核心思想是,让我们能够从视觉上直观的 把握整个类的资源。进而掌握了这个类的使用。再也不用懵逼了。

3.2大招二:修饰符分析

不要急着去研究每个方法里面代码的实现,我们先得先分析一下,这些资源中,我们真正能用的有哪些属性和方法。
为什么呢?因为Java中的属性和方法中会有修饰符啊,特别是用private修饰的属性和方法,是私有的,对外界来说是隐藏的。关于Java中各种修饰符的使用,大家可以自己Google搜索下。

把private 修饰的方法剔除掉,,你会发现,我们能用的方法也就没几个了。小编数了数,能用方法也就7个了。

换句话来说,如果我要使用这个类去解决一个问题,我根本就不用关心你那些所谓的private方法或者属性。因为无论你内部怎么折腾,这些都是你们内部的事情,与我无关。就像老板跟你说,我不管你上班干什么,反正你给我把事情做好就ok 。

这样子,是不是很清晰了!!Hold的住了吧!

3.3大招三:方法内部分析:由 代码结构层次 确立 都有哪些流程。

如果我们使用了别人的写的类,顺利的解决了问题。那么一切都到此为止了。如果没有必要,我们一般都不会去关心,它的内部实现的原理。就像老板只关心结果一样,它才不在乎你的过程有多艰难。然而…

很不辛,你使用这个类时,它的方法内部逻辑是有问题的,这时候,你不得不去追踪分析。但是这个方法的代码量还不小,而且还有各种分支。比如说:这个方法内会使用到另一个class A 的方法mention aa,而class A 的方法mention aa,又使用了另一个class B的方法mention bb,同时还有各种回调等等,这些都是很常见的。如果你不懂套路,估计这时候,你又头大了!

通常这个时候,我们不要过分去关心它的实现原理,也就是说,我们不要在意细节性的问题。否则会死在细节上。

我们要做的是:把我们的整个流程捋一捋,捋顺来!!!一定要100%理顺整个流程,不能放过任何一个环节。一次理不顺,再研究、分析,再理…直到理顺为止。切记,切记。为什么这么强调呢,因为捋顺了的话,就等于确定了大方向,即使后期有什么变化或者失误,我们也可以快速的反应和调整。用一句话来形容:一切尽在掌握中。就像是掌握了别人命运,一个字,爽!暴爽!!

这里必须的声明下,一个项目肯定有很多功能,和很多跨部门的协作。小编说的捋顺整个流程是指,我们要做的部分,并不是指整个项目的哈。
当然,很多时候,公司都不会有太多时间给我们去捋顺整个流程,难道你一天捋不顺,就不开始干活吗?那肯定是不行的,如果这样的话,老板早叫你滚蛋了!!所以,实际中都是先找出一些头绪,然后清楚一下大体的流程,然后就开始干了。之后,就是一边干,一边理整个流程,如果中间有任何疑问,或者大的方向不清晰了,还的停下一切工作,再从头到尾来理一理思路。直到没有盲点。
这种工作模式,会一直循环,直到某个时刻,你会发现,我个擦,通了。后面的事做起来,那简直就是神速!

这个过程中,还需要注意的两点:

第一、整理出整个流程是怎么实现的,都有哪些流程。可以肯定的说,只要流程通了,那么问题被解决那是迟早的事。

第二、对于流程中使用了那些类,我们只关心它返回的结果,返回的是什么和它的数据类型。

这个过程中,我们通常都要一边理,一边画草图。画草图的时候,一定不要在乎工整不工整的,要做到有想法就立马画下来,或者记录下来。因为思考都是高速的,稍从即逝,如果你停下来画个工整的玩意,脑袋又会停下来了。所以画完草图后,都要及时,找时间进行整理和总结。不然,到时候,又TMD忘了。完全不知道是咋回事。

下面我们还是来实战个例子吧:

好了,这就是小编今天想讲的:怎么快速的把握一个类。其实文章中还包含了两个思想。第一个是,我们怎么去学习一个 陌生的新事物。第二个是,我们学习中的一种管理的思想吧。无论是管理自己,还是项目的开发,或者学习等,我们都要从总体上把握,不要到时候 只见树木不见森林。或者是 陷在某一块,无法自拔! 毕竟一个项目或者一个系统,都不只是由这么一小块来组成,同样的道理,我们还要学会跟别人协作,毕竟现在已经不是单打独斗的时代了。

至于说,怎么从总体上来管理自己,小编觉得,这个还真得从你认识自己开始。有句话说的好:认识自己,做自己。
人生不要在意细节,其实,这句话的意思是想告诉大家,人生中我们要抓的是那些重要的事情。而不是琐碎的小事。轻重缓急吧!

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值