一个类仅包含静态字段和方法是否是不好的实践?

78

我有一个类,它只包含静态成员变量和静态方法。本质上,它充当一个通用工具类。

一个仅包含静态成员变量和静态方法的类是不是不好的实践?


29
java.lang.Math 是一个完全由静态方法组成的类,其构造函数为 private(无法实例化)。 - Asaph
不确定这个问题是否在这个论坛中被问过。但是一个类只有静态字段是一种不好的实践吗?我见过很多这样的类,我认为它们不适合面向对象编程。 - ka3ak
@ka3ak 这个问题的一些答案部分地解决了只有静态字段的类的问题。 - Stephen Watkins
15个回答

1

实用方法通常放置在只有静态方法的类中(例如StringUtils)。全局常量也被放置在它们自己的类中,以便可以被代码的其余部分导入(public final static属性)。

这两种用法非常普遍,并且具有私有默认构造函数,以防止它们被实例化。声明类为final可以防止尝试覆盖静态方法的错误。

如果您所说的静态成员变量并不是全局常量,您可能希望将访问这些变量的方法放置在它们自己的类中。在这种情况下,您能否详细说明这些变量在您的代码中的作用?


1

1
这个链接http://java.dzone.com/articles/why-static-bad-and-how-avoid似乎与大部分答案相反。即使它不包含成员变量(即没有状态),静态类仍然可能是一个坏主意,因为它无法被模拟或扩展(子类化),因此它违背了一些面向对象的原则。

0

来自TSLint文档

来自Java风格的面向对象语言的用户可能会将其实用函数包装在额外的类中,而不是将它们放在顶层。

最好的方法是使用常量,像这样:

export const Util = {
    print (data: string): void {
        console.log(data)
    }
}

此规则的错误代码示例:

class EmptyClass {}

class ConstructorOnly {
  constructor() {
    foo();
  }
}

// Use an object instead:
class StaticOnly {
  static version = 42;
  static hello() {
    console.log('Hello, world!');
  }
}

此规则的正确代码示例:

class EmptyClass extends SuperClass {}

class ParameterProperties {
  constructor(public name: string) {}
}

const StaticOnly = {
  version: 42,
  hello() {
    console.log('Hello, world!');
  },
};

0

我不会为实用程序类包含静态方法而担心。

然而,静态成员本质上是全局数据,应该避免使用。如果它们用于缓存静态方法的结果等,可能是可接受的,但如果它们被用作“真正的”数据,可能会导致各种问题,例如隐藏的依赖和设置测试的困难。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接