진정으로 정적 클래스와 아무것도 잘못이 정적 . 다시 말해서, 메소드의 출력이 변경되도록하는 내부 상태는 없습니다.
Dice.roll()
단순히 1에서 6까지 새로운 난수를 반환하는 경우 상태가 변경되지 않습니다. 물론 Random
인스턴스를 공유하고 있지만 정의에 따라 상태가 변경되면 출력이 항상 무작위로 잘 될 것이라고는 생각하지 않습니다. 또한 스레드 안전하므로 문제가 없습니다.
종종 최종 "Helper"또는 개인 생성자와 정적 멤버가있는 기타 유틸리티 클래스가 표시됩니다. 개인 생성자는 논리를 포함하지 않으며 누군가 클래스를 인스턴스화하지 못하도록합니다. 최종 수정자는이 아이디어가 당신이 파생시키려는 클래스가 아니라는 가정을 가져옵니다. 단지 유틸리티 클래스 일뿐입니다. 제대로된다면 싱글턴이나 다른 클래스 멤버가 없어야합니다.
이 지침을 따르고 싱글 톤을 만들지 않는 한, 이것에 전혀 문제가 없습니다. 당신은 컨트롤러 클래스를 언급,이 능력은 거의 것입니다 확실히 내가 정적 방법을 사용하여에 대해 조언을 할 수 있도록, 상태 변화를 필요로한다. 정적 유틸리티 클래스에 크게 의존 할 수 있지만 정적 유틸리티 클래스로 만들 수는 없습니다 .
수업의 상태 변화 는 무엇입니까 ? 음수는 정의에 의해 결정적이지 않기 때문에 1 초 동안 임의의 숫자를 제외 시키므로 반환 값은 자주 변경됩니다.
순수한 함수는 결정 론적 함수입니다. 즉, 주어진 입력에 대해 하나의 정확한 결과를 얻습니다. 정적 메소드가 순수한 함수가되기를 원합니다. Java에는 정적 메소드의 동작을 조정하여 상태를 유지하는 방법이 있지만 좋은 아이디어는 아닙니다. 메소드를 static 으로 선언 하면 일반적인 프로그래머는 박쥐가 순수한 함수라고 가정합니다. 예상되는 동작에서 벗어나는 것은 프로그램에서 버그를 생성하는 경향이 있으며 일반적으로 말하면 피해야합니다.
싱글 톤은 "순수 함수"와 반대되는 정적 메소드를 포함하는 클래스입니다. 하나의 정적 개인 멤버는 클래스의 내부에 유지되며 정확히 하나의 인스턴스가 있는지 확인하는 데 사용됩니다. 이것은 모범 사례가 아니며 여러 가지 이유로 나중에 문제를 일으킬 수 있습니다. 우리가 무엇을 말하는지 알기 위해, 여기 싱글 톤의 간단한 예가 있습니다 :
// DON'T DO THIS!
class Singleton {
private String name;
private static Singleton instance = null;
private Singleton(String name) {
this.name = name;
}
public static Singleton getInstance() {
if(instance == null) {
instance = new Singleton("George");
}
return instance;
}
public getName() {
return name;
}
}
assert Singleton.getInstance().getName() == "George"