如何在没有初始化的情况下访问公共方法

时间:2018-01-14 08:02:00

标签: java android android-library

我正在尝试创建一个简单的库,我想在其中定义类似于Glide的类。因此我可以使用MyAnimation.with(context)来调用它,但无论我将其定义为abstractfinal还是Singleton,我都无法做到。我必须创建一个实例来访问其公共方法with(Context context),其编写如下:

/**
 * initializes context for the current instance
 * @param context context to be used for {@link ConstraintSet}
 * @return an instance of {@link MyAnimation}
 */
public MyAnimation with(Context context) {
    mContext = context;
    mConstraintSet = new ConstraintSet();
    return this;
}

如您所见,with()返回该类的实例,然后我有另一个公共方法from(@LayouRes int res),它采用布局并再次返回this

/**
 *
 * @param secondKeyframe This is the layout from which constraints will be picked
 * @return An instance of this class
 * @throws IllegalStateException Throws exception if context has not been initialized
 */
public MyAnimation from(@LayoutRes int secondKeyframe, Transition customTransition) throws IllegalStateException {
    if(mContext == null) {
        throw new IllegalStateException("Context not initalized. Please call with(Context) first");
    }
    mTransition = customTransition;
    mConstraintSet.clone(mContext, secondKeyframe);
    return this;
}

最后,有一个方法animate(ViewGroup view)可以在ViewGroup上执行简单动画。有什么想法我能做到吗?

   /**
     * Applies animation after applying new {@link ConstraintSet}
     * @param view The ViewGroup on which the animation will be performed
     */
    public  void animate(ViewGroup view) {
        mConstraintSet.applyTo((ConstraintLayout) view);
        mLayout = (ConstraintLayout) view;
        if(mTransition != null) {
            TransitionManager.beginDelayedTransition(mLayout, mTransition);
        }
        else {
            TransitionManager.beginDelayedTransition(mLayout);
        }

    }

拜托,我真的想把我的图书馆叫做Glide(:D)

4 个答案:

答案 0 :(得分:3)

您需要制作这些方法set。静态方法不需要调用类的实例。他们只是类成员,而不是实例成员

答案 1 :(得分:1)

正如@PrzemysławMoskal所说,

  1. 如果您想访问Class.method()之类的方法,那么method应为static
  2. 我猜你不需要返回this,因为你可以从调用方法的地方MyAnimation.xxxfrom()访问with()
  3. 此外,您无法从non-static方法访问static个变量;所以,请mContext, mConstraintSet, mTransitionstatic
  4. 如果您再收到任何错误,请告诉我。

答案 2 :(得分:1)

您需要将方法设为静态:

   public class MyGlide{

    public static MyAnimation with(Context context) {
       //do something
    };
}

所以当你在另一个活动/班级中调用它时

MyGlide.with(CurrentContext);

答案 3 :(得分:1)

因为,MyAnimation是由您和您编写

时定义的类
MyAnimation.with(context)

这意味着with()应该被定义为static方法,它告诉它具有类级别关联而不是实例。

您还需要了解,使用this关键字实际上是指此类的当前实例。现在,这将与上述陈述相矛盾。您无法同时将方法声明为staticreturn this

当您在问题中提及Singleton时,我假设您正在尝试return MyAnimation的实例。因此,如果您在每次调用时都需要新实例,那么只需更改

即可
return this;

return new MyAnimation();