小编Seb*_*ebi的帖子

观察者模式:内部与外部注册

注册观察员的最佳选择是什么?我没有找到关于这个主题的任何内容。主要讨论了“推与拉”,但也有几个选项可以注册观察者。

public static void main(String[] args)
{
    Subject subject = new ConcreteSubject();
    // External registration
    Observer observerExternal = new ConcreteObserverExternal();
    subject.registerObserver(observerExternal);
    // Internal registration, option 1
    Observer observerInternal1 = new ConcreteObserverInternal1(subject);
    // Internal registration, option 2
    ConcreteObserverInternal2 observerInternal2 = new ConcreteObserverInternal2(subject);
}

interface Observer
{
    void inform();
}
class ConcreteObserverExternal implements Observer
{
    @Override
    public void inform()
    {
        // do sth.
    }
}
class ConcreteObserverInternal1 implements Observer
{
    public ConcreteObserverInternal1(Subject subject)
    {
        subject.registerObserver(this);
    }

    @Override
    public void inform()
    {
        // …
Run Code Online (Sandbox Code Playgroud)

java oop design-patterns

7
推荐指数
1
解决办法
529
查看次数

在Java 8 lambda表达式中使用?:运算符时出现异常

为什么?:在Java 8 lambda表达式中使用运算符时会抛出异常?
当我尝试运行以下示例代码时:

import java.util.ArrayList;
import java.util.List;

public class TestClass
{
    public static void main(String[] args)
    {
        List<Foo> foos = new ArrayList<>();
        boolean b = true;
        foos.forEach(foo -> (b ? foo.doSth(1) : foo.doSth(2)));
    }

    @FunctionalInterface
    interface Foo
    {
        public void doSth(int i);
    }
}
Run Code Online (Sandbox Code Playgroud)

我得到以下异常:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
at gui.marksDetection.view.TestClass.main(TestClass.java:8)
Run Code Online (Sandbox Code Playgroud)

当用for-each-loop替换lambda表达式,或者用(b ? foo.doSth(1) : foo.doSth(2))if-else-block 替换时,一切正常,所以组合似乎有问题?: + lambda.但是,Eclipse不会将其标记为错误.

java lambda exception

3
推荐指数
1
解决办法
3842
查看次数

标签 统计

java ×2

design-patterns ×1

exception ×1

lambda ×1

oop ×1