关于java:android中helper方法的最佳实践

Best practice for helper methods in android

我有两个自定义视图,它们都继承自相对布局。这两种方法都需要相同的助手方法。

F.E.

1
2
3
4
5
6
public static void setViewHeight(View v, int heightInDp) {
    ViewGroup.LayoutParams layoutParams = v.getLayoutParams();
    layoutParams.height = Helper.convertDpToPixel(heightInDp);

    v.setLayoutParams(layoutParams);
}

如您所见,目前我正使用一个带有静态方法的助手/实用程序类来实现这一目的。但我对它感到不舒服,我在寻找一种更干净的方式,而不是将视图传递给静态上下文。

另一个想法是编写一个从relativelayout扩展的抽象基类。但是,如果以后要在其他自定义视图中使用helper方法,我不希望被绑定到relativelayout。

我最后的想法是为每个助手方法创建一个类。上面的例子可能是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class LayoutTransition {

    private View mView;

    public LayoutTransition(View v) {
        mView = v;
    }

    public View withHeight(int height) {
        ViewGroup.LayoutParams layoutParams = mView.getLayoutParams();
        layoutParams.height = height;
        mView.setLayoutParams(layoutParams);
        return mView;
    }

}

但在这里,我必须总是使用副本和许多对象。

解决这个难题的最佳实践是什么?


我通常使用带有私有构造函数的最后一个类来为类似的事情创建一个Util类,并将对Context的引用传递给Util类。这样,helper/util类就不会保留对Context的任何引用,如下示例:

1
2
3
4
5
6
7
8
9
10
11
public final class LayoutUtils {

  private LayoutUtils() {
    throw new IllegalStateException("No instances.");
  }

  public static void convertDpToPixel(final int heightInDp, final Context context) {
    // make use of final to protect your context
    // do stuff w/ context and height here
  }
}

您可以在代码中使用它作为LayoutUtils.convertDpToPixel(height, context)

这种模式很容易与ViewContext这样的东西一起使用。


I have two custom views which both inherits from RelativeLayout.

如果只有两个自定义视图,那么在每个视图的类中分别定义方法。我知道它会增加冗余,但它比将视图传递给静态方法或创建许多对象要好。

最好只在传递给方法的对象是不可变(final)的情况下创建静态方法,在最佳情况下是原始数据类型。否则,如果可能,请避免使用静态助手方法。

在你的例子中,如果你有两个以上的自定义视图,单独的简单的Java类,比如EDCOX1,5,似乎是个好的解决方案。

What is the best practice for this difficulty?

它总是取决于情况,所以没有任何完美的解决方案。总会有取舍