子类化应用程序是在Android中实现静态帮助器方法的唯一方法吗?

Ste*_*ual 1 android subclass

我希望在我的Android应用程序中有一个帮助程序类,如Convert或Utils.我遇到的典型问题是:

public class Convert {

    private Convert() {
        // I can't be instantiated
    }

    public static int pxToDp(float pixels) {
        DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, pixels, displayMetrics);
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的失败当然是因为Convert不知道getResources()是什么.这让我有两个选择:

  1. 每次我想使用辅助方法时传递上下文,这是垃圾
  2. 子类应用程序,修改我的清单,然后创建一个引用,如下所示:

    public class App extends Application {
    
        private static Context mContext;
    
        @Override
        public void onCreate() {
            super.onCreate();
            mContext = this;
        }
    
        public static Context getContext() {
            return mContext;
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

然后App.getContext()到处都需要它.

问题:这不可能是正确的,优雅的方式是什么?

Oll*_*e C 5

如果你对应用程序显然有用,那么你可能最终会遇到一个巨大的,可怕的课程,它会完成一大堆与之无关的东西 - 对单一责任原则的粗暴对待.

是的,将Context传递给实用程序类有点麻烦和烦人,但这意味着您可以为每种类型的实用程序创建类(例如StringUtils或其他),并至少将责任分开.

我建议不要在任何地方使用App.getContext,因为这意味着所有的实用程序类都将依赖于App,这使得重用它们变得很困难.如果传入上下文,则可以更轻松地重用其他应用程序中的某些实用程序类.

所以我会说使用单独的类,并将该Context传递给方法.这有点难看,但在我看来,比其他选择更难看.