相关疑难解决方法(0)

为什么静态变量被视为邪恶?

我是一名Java程序员,对企业界不熟悉.最近我使用Groovy和Java 开发了一个应用程序.我编写的所有代码都使用了相当多的静态代码.高级技术部门要求我减少使用的静力学数量.我用Google搜索了同样的东西,我发现很多程序员都反对使用静态变量.

我发现静态变量使用起来更方便.而且我认为它们也是有效的(如果我错了,请纠正我),因为如果我必须对一个类中的函数进行10,000次调用,我很乐意将该方法设置为静态并使用简单的方法Class.methodCall()而不是用10,000个类的实例来混乱内存,对吧?

此外,静态减少了代码其他部分的相互依赖性.他们可以充当完美的国家持有者.除此之外,我发现静态在一些语言中得到广泛实现,如SmalltalkScala.那么为什么程序员(尤其是Java世界)中普遍存在对静态的压迫呢?

PS:如果我对静力学的假设是错误的,请纠正我.

java static

606
推荐指数
16
解决办法
23万
查看次数

Java 8默认方法作为特征:安全吗?

在Java 8中使用默认方法作为穷人的特征是一种安全的做法吗?

一些人声称如果你只是为了它而使用它们可能会让熊猫感到悲伤,因为它很酷,但这不是我的意图.还经常提醒的是,引入了默认方法来支持API演变和向后兼容性,这是事实,但这并不会使它们错误或扭曲以将它们用作特征本身.

我有以下实际用例:

public interface Loggable {
    default Logger logger() {
        return LoggerFactory.getLogger(this.getClass());
    }
}
Run Code Online (Sandbox Code Playgroud)

或许,定义一个PeriodTrait:

public interface PeriodeTrait {
    Date getStartDate();
    Date getEndDate();
    default isValid(Date atDate) {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

无可否认,可以使用组合(甚至是辅助类),但它看起来更冗长,更混乱,并且不允许从多态性中受益.

那么,使用默认方法作为基本特征是否可行/安全,还是应该担心不可预见的副作用?

关于SO的几个问题与Java vs Scala特征有关; 这不是重点.我也不仅仅是在征求意见.相反,我正在寻找一个权威的答案或至少是现场洞察力:如果你在公司项目中使用默认方法作为特征,那么它是否真的是一个时间炸弹?

java traits java-8 default-method

115
推荐指数
1
解决办法
1万
查看次数

何时是初始化默认方法的接口?

在搜索Java语言规范来回答这个问题时,我了解到了这一点

在初始化类之前,必须初始化其直接超类,但不会初始化类实现的接口.同样,在初始化接口之前,不会初始化接口的超接口.

为了我自己的好奇心,我尝试了它,正如预期的那样,界面InterfaceType没有被初始化.

public class Example {
    public static void main(String[] args) throws Exception {
        InterfaceType foo = new InterfaceTypeImpl();
        foo.method();
    }
}

class InterfaceTypeImpl implements InterfaceType {
    @Override
    public void method() {
        System.out.println("implemented method");
    }
}

class ClassInitializer {
    static {
        System.out.println("static initializer");
    }
}

interface InterfaceType {
    public static final ClassInitializer init = new ClassInitializer();

    public void method();
}
Run Code Online (Sandbox Code Playgroud)

这个程序打印

implemented method
Run Code Online (Sandbox Code Playgroud)

但是,如果接口声明了default方法,则会发生初始化.考虑InterfaceType给出的接口为

interface InterfaceType {
    public …
Run Code Online (Sandbox Code Playgroud)

java interface java-8 default-method

92
推荐指数
3
解决办法
6276
查看次数

标签 统计

java ×3

default-method ×2

java-8 ×2

interface ×1

static ×1

traits ×1