我有一位同事需要一种可供两个类使用的方法。
他决定创建一个新的接口(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/