我刚刚注意到,在接口中可以选择使用静态方法。与接口的静态字段相同,有一个有趣的行为:这些不是继承的。
我不确定它在要实现的实际接口中是否有用。但是,它使程序员能够创建仅仅是静态内容的信封的接口,例如实用程序类。
一个简单的例子只是全局常量的包络。与班级相比,您可以轻松地注意到public static final
那些假定的样板丢失了(使它不太冗长)。
public interface Constants {
String LOG_MESSAGE_FAILURE = "I took an arrow to the knee.";
int DEFAULT_TIMEOUT_MS = 30;
}
您还可以使事情变得更复杂,例如配置键的伪枚举。
public interface ConfigKeys {
static createValues(ConfigKey<?>... values) {
return Collections.unmodifiableSet(new HashSet(Arrays.asList(values)));
}
static ConfigKey<T> key(Class<T> clazz) {
return new ConfigKey<>(clazz);
}
class ConfigKey<T> {
private final Class<T> type;
private ConfigKey(Class<T> type) {
this.type = type;
}
private Class<T> getType() {
return type;
}
}
}
import static ConfigKeys.*;
public interface MyAppConfigKeys {
ConfigKey<Boolean> TEST_MODE = key(Boolean.class);
ConfigKey<String> COMPANY_NAME = key(String.class);
Set<ConfigKey<?>> VALUES = createValues(TEST_MODE, COMPANY_VALUE);
static values() {
return VALUES;
}
}
您也可以通过这种方式创建一些实用程序“类”。但是,在实用程序中,使用私有或受保护的助手方法通常很有用,而在类中却不太可能。
我认为这是一个不错的新功能,尤其是静态成员没有被继承的事实是一个有趣的概念,仅引入接口。
我想知道您是否可以认为这是一个好习惯。虽然代码风格和最佳实践不是不言而喻的,并且仍有意见的余地,但我认为通常有充分的理由支持意见。
我对使用这两种模式的原因(而不是原因)更感兴趣。
请注意,我不打算实现这些接口。它们仅仅是其静态内容的信封。我只打算使用常量或方法,并且可能使用静态导入。
default
方法。我在说static
方法和领域。这些不是继承的,所以它们不会破坏多重继承。