gmh*_*mhk 89 java oop interface inner-classes
是否可以在界面中创建内部类?如果有可能我们为什么要创建这样的内部类,因为我们不打算创建任何接口对象?
这些内部类有助于任何开发过程吗?
zaf*_*003 105
是的,我们可以在接口内部使用类.使用的一个例子可能是
public interface Input
{
public static class KeyEvent {
public static final int KEY_DOWN = 0;
public static final int KEY_UP = 1;
public int type;
public int keyCode;
public char keyChar;
}
public static class TouchEvent {
public static final int TOUCH_DOWN = 0;
public static final int TOUCH_UP = 1;
public static final int TOUCH_DRAGGED = 2;
public int type;
public int x, y;
public int pointer;
}
public boolean isKeyPressed(int keyCode);
public boolean isTouchDown(int pointer);
public int getTouchX(int pointer);
public int getTouchY(int pointer);
public float getAccelX();
public float getAccelY();
public float getAccelZ();
public List<KeyEvent> getKeyEvents();
public List<TouchEvent> getTouchEvents();
}
Run Code Online (Sandbox Code Playgroud)
这里的代码有两个嵌套类,用于封装有关事件对象的信息,这些事件对象稍后在方法定义中使用,如getKeyEvents().将它们放在Input界面内可以提高内聚力.
Syn*_*r0r 44
是的,您可以在Java界面中创建嵌套类或内部类(请注意,与流行的看法相反,没有" 静态内部类 " 这样的东西:这根本没有意义,没有"内在",没有" outter"当一个嵌套类是静态的时,所以它不能是"静态内部").
无论如何,以下编译好:
public interface A {
class B {
}
}
Run Code Online (Sandbox Code Playgroud)
我已经看到它曾经在接口定义中直接放置某种"合同检查器"(好吧,在嵌套在接口中的类中,可以有静态方法,与接口本身相反,这不可能).如果我没记错的话,看起来像这样.
public interface A {
static class B {
public static boolean verifyState( A a ) {
return (true if object implementing class A looks to be in a valid state)
}
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,我不是在评论这种事情的用处,我只是回答你的问题:它可以完成,这是我见过的一种用法.
现在我不会评论这种结构的有用性,并且从我看到过:我已经看过了,但它不是一个非常常见的结构.
200KLOC代码库在这里恰好零时间发生(但后来我们还有许多其他的事情,我们认为不好的做法恰好发生在零时间,其他人会发现完全正常所以......).
hel*_*ios 41
有效使用IMHO定义了封闭接口方法接收或返回的对象.数据保持结构.通过这种方式,如果对象仅用于该接口,那么您可以使用更具凝聚力的方式.
举例:
interface UserChecker {
Ticket validateUser(Credentials credentials);
class Credentials {
// user and password
}
class Ticket {
// some obscure implementation
}
}
Run Code Online (Sandbox Code Playgroud)
但无论如何......这只是品味问题.
Bac*_*chi 10
一个有趣的用例是通过内部类为接口方法提供一种默认实现,如下所述:https://stackoverflow.com/a/3442218/454667(以克服单类继承的问题).
它当然是可能的,并且我发现它有用的一种情况是接口必须抛出自定义异常.您可以使用相关的接口保留异常,我认为这些异常通常比使用大量异常文件乱丢源树更整洁.
interface MyInterface {
public static class MyInterfaceException extends Exception {
}
void doSomething() throws MyInterfaceException;
}
Run Code Online (Sandbox Code Playgroud)
是的,可以在接口内部使用静态类定义,但是这个特性最有用的方面可能是使用枚举类型(这是一种特殊的静态类).例如,你可以这样:
public interface User {
public enum Role {
ADMIN("administrator"),
EDITOR("editor"),
VANILLA("regular user");
private String description;
private Role(String description) {
this.description = description;
}
public String getDescription() {
return description;
}
}
public String getName();
public void setName(String name);
public Role getRole();
public void setRole(Role role);
...
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
69503 次 |
| 最近记录: |