복붙노트

[SCALA] 왜 싱글 톤 객체 지향 더 많은 개체입니까?

SCALA

왜 싱글 톤 객체 지향 더 많은 개체입니까?

스칼라 프로그래밍 : 종합 단계별 가이드, 저자는 말했다 :

왜 싱글 톤 객체 더 객체 지향한다? 객체 싱글은 무엇 정적 멤버를 사용하지 않는 좋은,하지만?

해결법

  1. ==============================

    1."큰 그림"을 위해 노력; 이 중 대부분은 다른 답변으로 덮여있다,하지만 박았을 모두 함께하고이 점에 참여하는 하나의 포괄적 인 답변이 될 것 같지 않습니다. 그래서 여기 간다 ...

    "큰 그림"을 위해 노력; 이 중 대부분은 다른 답변으로 덮여있다,하지만 박았을 모두 함께하고이 점에 참여하는 하나의 포괄적 인 답변이 될 것 같지 않습니다. 그래서 여기 간다 ...

    클래스에 정적 메소드는 객체의 메소드, 그 수단이 아니다 :

    그들은 부모 개체에서 상속 인터페이스를 구현하고 인수로 전달 될 수있는 객체의 요점은 - 그들이 진정한 객체 지향되지 않도록 정적 멤버가 있는데, 이들 중 아무도 없어, 그들은 더 네임 스페이스보다 작은입니다.

    객체 싱글, 다른 한편으로는, 객체 사회의 제몫 회원입니다.

    싱글의 또 다른 매우 유용한 특성들이 쉽게 싱글하지 시간의 일부 나중에 변경 될 수 있다는 것입니다 당신이 정적 메서드에서 시작하는 경우, 이것은 특히 고통스러운 리팩토링이다.

    나중에 두 번째 프린터를 추가 할 수 있도록하고, 사용자들이 ... 그것은 같으면 사용합니다 어느 하나를 선택 할 수 있도록, 당신이 어떤 클래스의 정적 메소드를 통해 프린터와 함께 주소와 표현의 상호 작용을 인쇄하는 프로그램을 설계 상상 't은 재미있는 경험이 될!

  2. ==============================

    2.싱글은 다른 유형을 구현 / 확장 할 수 있다는 점에서 클래스처럼 행동 객체.

    싱글은 다른 유형을 구현 / 확장 할 수 있다는 점에서 클래스처럼 행동 객체.

    정적 인 클래스와 자바에서 그렇게 할 수 없습니다 - 그것은 (적어도) 수의 getInstance 더 좋은 네임 스페이스 / 안정적 식별자와 가죽의 구분과 패턴 싱글 자바를 통해 꽤 설탕입니다.

  3. ==============================

    3.힌트 :이 객체 지향 프로그래밍이라고.

    힌트 :이 객체 지향 프로그래밍이라고.

    진심으로.

    어쩌면 나는 근본적으로 중요한 뭔가가 있어요,하지만 난 소란이 모든 것이 표시되지 않습니다 : 객체가 더 객체 지향가 객체이기 때문에 비 객체보다. 그건 정말 설명이 필요합니까?

    참고 : 방법, 난 정말 여기 잘난척하는 소리를하려고하지 오전 그것을 확인 보이지만. 나는 모든 다른 답변 살펴 보았다 그리고 나는 그들이 몹시 혼란을 발견했다. 나를 위해, 그것은 개체 및 방법은 그런 종류의 명백한로의 더 객체 지향 "객체 지향"의 매우 정의 (정적 "방법"정말 무엇 인) 네임 스페이스 및 절차보다.

    싱글 톤 객체를 가지고하는 대신 예로서, 자신이 객체 클래스를 만드는 것 루비, 파이썬, 스몰 토크, 신어는 않습니다.

  4. ==============================

    4.정적 멤버의 경우, 오브젝트가 없습니다. 이 클래스는 정말 그냥 네임 스페이스입니다.

    정적 멤버의 경우, 오브젝트가 없습니다. 이 클래스는 정말 그냥 네임 스페이스입니다.

    싱글에서는 항상 적어도 하나의 오브젝트가있다.

    모든 정직에서, 분할 머리카락을합니다.

  5. ==============================

    5.그것은 스칼라 클래스 주어진 모든 메서드 호출이 해당 객체에 메서드 호출이 있다는 의미에서 지향 이상의 오브젝트입니다. 자바에서 정적 방법은 객체 상태와 상호 작용하지 않습니다.

    그것은 스칼라 클래스 주어진 모든 메서드 호출이 해당 객체에 메서드 호출이 있다는 의미에서 지향 이상의 오브젝트입니다. 자바에서 정적 방법은 객체 상태와 상호 작용하지 않습니다.

    사실, 정적 메서드 m ()가있는 클래스 A의 객체 a를 주어, 그것은 () 호출 a.m 나쁜 연습 간주됩니다. 대신이 A.m ()를 호출하는 것이 좋습니다 (I 이클립스 당신에게 경고를 줄 것으로 예상). 자바 정적 메소드를 재정의 할 수 없습니다, 그들은 또 다른 방법으로 숨길 수 있습니다 :

    class A {
        public static void m() {
            System.out.println("m from A");
        }
    }
    public class B extends A {
        public static void m() {
            System.out.println("m from B");
        }
        public static void main(String[] args) {
            A a = new B();
            a.m();
        }
    }
    

    a.m () 무엇을 인쇄 할 것인가?

    동반자는 객체와 B와 의도 컴패니언 A 또는 B에 명시 적으로 참조하는 것처럼 명확 것에 스칼라에서는 정적 메소드를 스틱 것

    스칼라에서 같은 예제를 추가 :

    class A
    object A { 
      def m() = println("m from A") 
    }
    class B extends A
    object B { 
      def m() = println("m from B")
      def main(args: Array[String]) {
        val a = new B
        A.m() // cannot call a.m()
      }
    }
    
  6. ==============================

    6.일부 시나리오에서 중요 할 수있는 몇 가지 차이가있다. 자바 당신에 당신이 정적 메서드와 클래스가 있다면 정적 메서드를 재정의 할 수 없습니다 당신의 행동과 재정의 일부를 사용자 정의 할 수 없을 것입니다 때문에. 당신이 싱글 톤 객체를 사용하는 경우, 당신은 단지 서브 클래스에서 만든 싱글을 연결 할 수있다.

    일부 시나리오에서 중요 할 수있는 몇 가지 차이가있다. 자바 당신에 당신이 정적 메서드와 클래스가 있다면 정적 메서드를 재정의 할 수 없습니다 당신의 행동과 재정의 일부를 사용자 정의 할 수 없을 것입니다 때문에. 당신이 싱글 톤 객체를 사용하는 경우, 당신은 단지 서브 클래스에서 만든 싱글을 연결 할 수있다.

  7. ==============================

    7.정말, 마케팅 것입니다. 두 가지 예를 고려해

    정말, 마케팅 것입니다. 두 가지 예를 고려해

    class foo
       static const int bar = 42;
    end class
    
    class superfoo
        Integer bar = ConstInteger.new(42);
    end class
    

    이제, 관찰 차이는 여기에 무엇입니까?

    그것은 "진짜"개체 지향 한 C ++ 또는 Java 여부를 20 개 이상의 년 전 종교 전쟁을 생각 나게 이후의 모든 모두 "진짜"개체를하지 않은 원시 타입 노출 후 - 당신은 INT에서 상속 할 수 없습니다 예를 들어 정도, 그러나 정수에서 수행 할 수 있습니다.

  8. from https://stackoverflow.com/questions/4112088/why-are-singleton-objects-more-object-oriented by cc-by-sa and MIT license