java - 静态 block 用法中的抽象类

标签 java abstract-class static-block

我可以添加abstract里面的关键词static initialization block , 但我不能添加抽象方法作为

abstract void draw();

所以我只能在静态 block 里面添加抽象类,如下:

static {
    abstract class Abstract { 
        abstract String test();
    }
    class Extends extends Abstract {

        @Override
        String test() {
            return null;
        }           
    }
    new Extends().test();

但是在访问级别低于私有(private)的静态 block 中添加类层次结构听起来并不现实,在静态 block 中是否还有其他用法 abstract

最佳答案

TL;DR 此功能没有合理的用法。如果我在代码审查中看到这一点,我会强制作者重构它。

有时,Java 规范允许您在正常的生产代码中编写不应该做的事情,对我来说,这就是一个例子。

让我们尝试推导出一个使用此功能的代码片段。

我们可以在静态初始化 block 中使用abstract 关键字。这只能在定义类时通过声明类本身 abstract 以及可选的一些方法来完成。

这个类在初始化 block 之外是不可见的,所以我们可以推断我们将在内部使用它。 abstract 都是关于创建实例或定义实例方法的。因此,只有当我们计划创建抽象类的实例时它才有用。

现在,类是抽象的,所以为了能够创建实例,我们至少需要一个子类。

如果我们只有一个子类,为什么要将其功能拆分为一个抽象的父类和一个子类?这将不必要地复杂化,因此我们可以假设我们有多个子类。

因此,要在静态初始化 block 中使用(至少是半正常的)abstract 关键字,该 block 必须定义一个抽象父类、多个子类以及创建代码这些类的实例,就像这个最小的例子:

static private int value;

static {
    abstract class Abstract {
        abstract int method1();
    }
    class Child1 extends Abstract {
        int method1() {
            return 1;
        }
    }
    class Child2 extends Abstract {
        int method1() {
            return 2;
        }
    }
    Abstract instance1 = new Child1();
    Abstract instance2 = new Child2();
    value = instance1.method1() + instance2.method1();
}

恕我直言,完全使用静态初始化器应该是个异常(exception),这样的怪物呼唤重构,例如将类从初始化 block 中移出,成为普通的嵌套类,或者更好的是,将它们移到自己的文件中。

这种抽象在初始化模式中与重构版本唯一不同的是类可见性。您的可见性仅限于 static { ... } block 内。但是,如果你的类是如此复杂和冗长以至于你担心在你的 static { ... } block 之外误用,那么你无论如何都输了......

关于java - 静态 block 用法中的抽象类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52685967/

相关文章:

java - Window JPanel 是透明的吗?

c# - 我可以强制子类重写一个方法而不使它抽象吗?

java - 在类中传递通用对象类型

java - Java 中抽象属性的解决方法

php - Magento 类别静态 block 仅不起作用

Magento 如何通过 id 从静态 block /页面链接到类别

java - 扫描仪方法 : next() vs nextLine()

java - html:text 如何设置占位符属性

java - 多个静态 block 的优点

java - 选择特定的 selectOneMenu 选项时如何显示 inputText?