小编Ale*_*ein的帖子

= Java中的运算符

考虑以下代码:

long val = 0;
for(int i = 0; i < 2; val++)
    val =+ ++i;

System.out.println(val);
Run Code Online (Sandbox Code Playgroud)

为什么val = 3到底?

我会像这样计算:

val     i
0       0   i < 2 = true;
0       0   ++i;
0       1   val =+ 1;
1       1   (end of for loop) val++;
2       1   i < 2 = true;
2       1   ++i;
2       2   val =+ 2;
4       2   (end of for loop) val++;
5       2   i < 2 = false;
Output: 5
Run Code Online (Sandbox Code Playgroud)

但它是3.我不明白为什么增量val …

java math operators

10
推荐指数
1
解决办法
533
查看次数

使用Enums封装事件处理

我的应用层/视图有一个事件调度系统,即黑板.在其中,侦听器由散列映射存储,其中键是作为枚举EventType实现的事件类型,而值是侦听此事件类型的侦听器引用.例如,模型对象正在侦听事件类型"LOCAL_PLAYER_INPUT",黑板进程并通知玩家,因为玩家实现了EventHandler接口.

我想通过为模型实现一个独立的黑板来进一步解耦我的模型.然后它将被添加为应用程序层黑板的监听器,因为应用程序层从键盘或触摸获得I/O. 模型黑板本身会进一步委托事件.为此我想创建一个枚举层次结构,其中事件以这种方式分类:

MODEL.LOCAL.PLAYER_INPUT
Run Code Online (Sandbox Code Playgroud)

只有通过这样传递MODEL,模型才会在视图黑板中注册为监听器:

addListener(model.blackboard, MODEL); //Types: (EventHandler, EventType)
Run Code Online (Sandbox Code Playgroud)

通过将接口与我实现的枚举相结合,我可以编写类似MODEL.XY的事件类型,但是尽管MODEL正在实现EventType接口,但addListener不会接受它.

我该怎么办?

编辑:更多代码

addListener方法:

    public void addListener(EventHandler handler, EventType eventType) {
    getListener(eventType).add(handler);}


private Array<EventHandler> getListener(EventType eventType) {
    if(map.containsKey(eventType))
        return map.get(eventType);
    else {
        Array<EventHandler> tmp = new Array<EventHandler>(false, 1, EventHandler.class);
        map.put(eventType, tmp);
        return tmp;
    }

}
Run Code Online (Sandbox Code Playgroud)

枚举:

public interface WL extends EventType {

public static enum LOCAL {
    PLAYER_INPUT,
    NPC_INPUT
}
Run Code Online (Sandbox Code Playgroud)

}

GameEvent:

    public GameEvent(EventType eventType, Object message) {
    this.eventType = eventType;
    this.message = message;
    timeStamp = System.currentTimeMillis();

}
Run Code Online (Sandbox Code Playgroud)

java enums

5
推荐指数
1
解决办法
495
查看次数

如果公共成员访问私有成员,则不要继承私有成员

如果这个问题可能一直被问到,我很抱歉,但我搜索过,找不到足够的答案.

如果私有成员/字段被公共成员/方法访问,如何禁用它们的继承?

所以考虑一下:

public class A {
    private MemberA a = new MemberA();

    public void foo(TypeA x) {
    a.methodCall(); //access to a
    }
}

public class B extends A {
    private MemberB b = new MemberB();

    public void foo(TypeB x) {
    b.methodCall(); 
    }
}
Run Code Online (Sandbox Code Playgroud)

如果你点击调试器,你会看到,B有一个类型为MemberA的字段.这符合Java规则,因为如果公共成员可以访问私有成员,那么它将被继承.但是在B中,"a"是无用的,只是占用内存 - 即使你没有在B的构造函数中实例化它,因为B调用它的超级构造函数并且它必须在A中实例化,因为它非常适用于a.

需要为A和B设置相同的方法名称,并且它们必须是公共的,但由于它们从根本上做了不同的事情但是共享共同的逻辑B需要从A继承.

所以基本上,我需要知道如何重载和重写方法同时.或重复代码.该怎么办?

java inheritance

0
推荐指数
1
解决办法
63
查看次数

标签 统计

java ×3

enums ×1

inheritance ×1

math ×1

operators ×1