首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在java中接受两种类型的单一方法,没有代码重复。

在java中接受两种类型的单一方法,没有代码重复。
EN

Stack Overflow用户
提问于 2018-08-03 07:34:43
回答 2查看 143关注 0票数 -1

我需要一个方法来接受两个类型,并对它们做同样的事情。

我知道我能做到:

代码语言:javascript
复制
public void myMethod(TextView tv, ReadableMap styles) {
    if (styles.hasKey("fontFamily")) {
        String font = "fonts/" + styles.getString("fontFamily") + ".ttf";
        Typeface tf = Typeface.createFromAsset(context.getAssets(), font);
        tv.setTypeface(tf);
    }
    if (styles.hasKey("fontSize")) {
        tv.setTextSize(styles.getInt("fontSize"));
    }
    if (styles.hasKey("letterSpacing")) {
        tv.setLetterSpacing(PixelUtil.toPixelFromDIP(styles.getInt("letterSpacing")));
    }
}

public void myMethod(TextPaint tv, ReadableMap styles) {
    // copy paste the **exact** same code
}

TextViewTextPaint都有setTypeface(Typeface)setTextSize(float)setLetterSpacing(float)方法,但除了Object之外,这两个类没有共享的超类型。(请注意,TextPaint继承了Paint的方法。)这两个类都使用相同的名称和签名分别声明这些方法。

因此,既然我不能相互转换,我想知道如何减少重复代码的数量?

EN

回答 2

Stack Overflow用户

发布于 2018-08-03 08:13:53

创建一个共享公共方法签名setTypeFacesetTextSizesetLetterSpacing的接口类。(基本上是Adapter模式。)

代码语言:javascript
复制
public interface MyInterface {
   Typeface setTypeface(Typeface typeface);
   void setTextSize (float textSize);
   void setLetterSpacing(float letterSpacing);
}

将myMethod签名重新定义为

代码语言:javascript
复制
public void myMethod (MyInterface myi, ReadableMap styles) {
   //...change all your 'tv' references to myi
}

然后用匿名类调用

代码语言:javascript
复制
// myTextView is in scope here...

myMethod(new MyInterface() {
      // partial implementation
      Typeface setTypeface(Typeface typeface) {
         myTextView.setTypeface(typeface);
      }, myStyles);
   }

// myTextPaint is in scope here   
myMethod(new MyInterface() {
      // partial implementation
      Typeface setTypeface(Typeface typeface) {
         myTextPaint.setTypeface(typeface);
      }, myStyles);
}

或者为TextView和TextPaint创建实现MyInterface的包装器类。

票数 1
EN

Stack Overflow用户

发布于 2018-08-03 10:59:59

这个怎么样?

代码语言:javascript
复制
 public void myMethod(TextView tv, String styles, TextPaint tp) {
    //must tv == null -> tp != null or tv != null -> tp == null
    if(tv != null){
        tp = tv.getPaint();
    }

   //doSomthing
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51663461

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档