为什么使用方法本地抽象内部类

Gor*_*don 23 java abstract-class inner-classes

可以与方法本地内部类一起使用的合法修饰符之一是abstract.

例如:

public class Outer {
    public void method(){
        abstract class Inner{
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

你有实际使用它的情况吗?

你必须知道SCJP考试.

Kaj*_*Kaj 12

这是原始问题中的一些无效假设.某些东西是合法/有效的Java并不意味着它是您需要使用或需要知道的东西.

我不记得SCJP包含奇怪的案例问题.

我试图提出一个案例,我将使用在方法中声明的抽象类,但是一切看起来很奇怪,并且设计糟糕.这是一个我想出的代码示例(仍然是糟糕的代码设计恕我直言)

public class BatchExecutor {

    public static enum ResultNotification {
        JMS,
        MAIL
    };

    public Runnable createRunnable(ResultNotification type) {
        abstract class Prototype implements Runnable {
            public void run() {
                performBusinessLogic();
                publishResult();
            }

            abstract void publishResult();
        }

        switch (type) {
            case JMS: {
                return new Prototype() {
                    void publishResult() {
                        //Post result to JMS
                    }
                };
            }
            case MAIL: {
                return new Prototype() {
                    void publishResult() {
                        //Post result to MAIL
                    }
                };
            }
        }
        return null;
    }

    private void performBusinessLogic() {
        //Some business logic
    }

}
Run Code Online (Sandbox Code Playgroud)


Sta*_*lin 9

我只能在这种情况下思考

class Outer {
    public void method() {
        abstract class A {
            void bar(){}
            abstract void foo();
        }
        class B extends A {
            @Override
            void foo() {
            }
        }
        final class C extends A {
            @Override
            void foo() {
            }
        }
        A a1 = new B();
        A a2 = new C();
    }
}
Run Code Online (Sandbox Code Playgroud)

但我无法想象真正的用法


aio*_*obe 7

你有实际使用它的情况吗?

  1. 设S 1表示您需要抽象类的所有情况.

  2. 设S 2表示您需要本地课程的所有情况.

  3. 在回答你的问题可以通过检查s内发现1 ∩小号2

相关问题:


澄清:我的观点是这两个特征(抽象类本地类)是该语言的两个完全正交的特征.了解每个功能何时有用是了解它们何时同时有用的关键.

  • -1我在这里看不到任何真正的价值 - 这样你几乎可以在不提供任何信息的情况下回答任何问题.而且,十字路口似乎很空洞. (3认同)
  • 如果您发现交叉路口为空,我相信这个问题已得到解答.(澄清了我的答案.) (3认同)

maa*_*nus 6

恕我直言,这个功能没有实际用途.有一些可能的滥用,但还有许多其他方法来编写错误的代码,你不需要学习这个.:d

每当您尝试使用抽象方法本地类时,您都需要定义至少两个具体的方法 - 内部类.这意味着你最终得到一个包含至少三个类的方法,该方法变得非常长,而且这种方式非常糟糕.

你必须知道SCJP考试.

我真的希望不是.方法本地内部类已经无用到被认为是一个极端情况(你应该理解它们但可能永远不会使用它们).

恕我直言,一个在考试中问这个问题的人误解了Java.在本地类上不能有可访问性修饰符,因为(缺少方法文字)无论如何都无法从外部访问类.可以有abstractfinal改性剂,因为没有理由去禁止他们.有充分理由允许它们:正交性最小惊讶原则.

  • 不幸的是,在 SCJP 考试中,您必须充当编译者。你需要知道的东西数量多得离谱,编译器会立即拿起它们。 (2认同)