java - 正确使用界面中的default关键字

标签 java java-8 interface default

我有一位同事需要一种可供两个类使用的方法。

他决定创建一个新的接口(interface)来由这些类实现。

该接口(interface)只有一个方法 默认 doThis(字符串参数)

它没有任何其他接口(interface)方法,没有迹象表明会向该接口(interface)添加其他方法。

我认为这是对界面的错误使用,应该以不同的方式完成。即,也许一个类具有允许其他类通过使用该对象来使用它的方法。

有这方面经验的 friend 可以分享一下吗?

我可以根据您的评论进行更详细的更新。

更新:

这是代码,问题仍然存在: 这是默认方法的有效使用还是应该以另一种方式完成此通用逻辑,例如保存到首选项的实用程序类?

界面:

public interface LogInCookie {

    default void mapCookiesToPreferences(String cookie) {
        if (cookie.contains(MiscConstants.HEADER_KEY_REFRESH)) {
            String refreshToken = cookie.replace(MiscConstants.HEADER_KEY_REFRESH, StringUtils.EMPTY);
            SharedPrefUtils.addPreference(SharedPrefConstants.REFRESH_TOKEN, refreshToken);
        } 
    }
}
public class HDAccountActivity extends AbstractActivity implements LogInCookie {

    private void mapCookies(List<String> mValue) {
       LogInCookie.super.mapCookiesToPreferences(mValue); //ekh!
    }

}
public class BaseSplashPage extends AppCompatActivity implements DialogClickedCallBack, LogInCookie {

//method which uses this
private void mapCookiesToPreferences(List<String> headers) {
        int firstItemInHeader = 0;
        for (String header : headers) {
            String  mValue =  header.substring(firstItemInHeader,header.indexOf(MiscConstants.SEMICOLON));
            LogInCookie.super.mapCookiesToPreferences(mValue);  //ekh!
        }
    }

}

最佳答案

接口(interface)中的default方法没有定义其他方法,无法对实现类的实例做太多有用的事情。它只能使用从java.lang.Object继承的方法,这些方法不太可能携带与接口(interface)相关的语义。

如果代码根本不使用 this 上的实例方法,换句话说,完全独立于 this 实例,则应将其设为 static,将包含类更改为不可实例化的class类型,即

final class SomeUtilClass {
    static void doThis(String parameter) {
    // ...
    }

    private SomeUtilClass() {} //no instances
}

并在使用此方法的类中使用import static packageof.SomeUtilClass.doThis;

这样,所有这些类都可以调用像 doThis(…) 这样的方法,而无需限定类型名称,也不需要误导性的类型层次结构。

当方法实际使用 this 实例时,如上所述,只能是从 java.lang.Object 继承的方法,类型继承< em>可能是有道理的。由于这种情况不太可能发生,您可能仍然认为类型层次结构具有误导性,并将代码重写为

final class SomeUtilClass {
    static void doThis(Object firstParameter, String parameter) {
    // ...
    }

    private SomeUtilClass() {} //no instances
}

使用firstParameter而不是this,它可以像doThis(this, …)一样调用。

关于java - 正确使用界面中的default关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60635925/

相关文章:

java - Windows Server 上 Tomcat 中的 Spnego keytab 身份验证失败

java - 无法从 Hashmap 获取对象的值,即使它返回相同的哈希码

iphone - setStatusBarOrientation 在 iOS8 中导致问题

WPF HiercharchicalDataTemplate.DataType : How to react on interfaces?

java - SQLite 无法在 OnCreate 方法中创建数据库。 E/SQLiteLog : (1)

java - Powermock verifyPrivate 不能与 any() 一起使用

java - 对泛型类型 Map<K,C> 的引用应该参数化

java - Map.computeIfPresent() 在 Java 中初始化 List

java - 如何获取类中所有方法的方法引用(Java)?

java - 我可以限制哪些类可以实现接口(interface)吗?