itsource

Java의 컨스트럭터는 프라이빗하게 할 수 있습니까?

mycopycode 2022. 8. 15. 21:35
반응형

Java의 컨스트럭터는 프라이빗하게 할 수 있습니까?

컨스트럭터는 프라이빗하게 할 수 있습니까?개인 컨스트럭터는 어떻게 유용합니까?

예, 컨스트럭터는 비공개일 수 있습니다.이것은 여러 가지 용도가 있다.이러한 용도하나는 싱글톤 디자인 안티패턴에 사용하는 것입니다.보다 정당한 또 다른 용도는 컨스트럭터를 위임하는 것입니다.실장 상세인 다양한 옵션을 사용할 수 있는 컨스트럭터를 1개 보유할 수 있기 때문에 프라이빗하게 하고 나머지 컨스트럭터는 위임합니다.

생성자를 위임하는 예로서, 다음 클래스를 사용하면 값과 유형을 저장할 수 있지만 유형의 하위 집합에 대해서만 저장할 수 있으므로 허용되는 유형만 사용하려면 일반 생성자를 비공개로 만들어야 합니다.공통 프라이빗 컨스트럭터는 코드 재사용을 지원합니다.

public class MyClass {
     private final String value;
     private final String type;

     public MyClass(int x){
         this(Integer.toString(x), "int");
     }

     public MyClass(boolean x){
         this(Boolean.toString(x), "boolean");
     }

     public String toString(){
         return value;
     }

     public String getType(){
         return type;
     }

     private MyClass(String value, String type){
         this.value = value;
         this.type = type;
     }
}

★★★★★
몇 년 후의 이 답변을 보면, 이 답변은 불완전하면서도 다소 극단적이라는 것을 알 수 있습니다.싱글톤은 확실히 안티패턴이기 때문에 가능한 한 피하는 것이 좋습니다.단, 싱글톤 이외에 프라이빗 컨스트럭터를 사용하는 경우는 많이 있습니다.1번으로 하다.

프라이빗 컨스트럭터를 사용하는 경우를 몇 가지 더 제시하려면:

  1. 관련된 스태틱 함수의 집합일 뿐인 인스턴스화되지 않은 클래스를 작성하려면(기본적으로는 싱글톤이지만 스테이트리스이며 스태틱함수가 클래스 상태가 아닌 파라미터로 엄격하게 동작하는 경우), 이것은 이전 자신이 제안한 것처럼 불합리한 접근법은 아닙니다.다만, 디폴트인 인터페이스를 사용하고 있습니다.endency를 삽입하면 구현에 더 많은 수의 종속성이나 다른 형태의 컨텍스트가 필요할 때 API를 쉽게 유지할 수 있습니다).

  2. 개 있는 경우 는 오브젝트의할 수 를 들어, 할 수 ).new ArrayList(5) ★★★★★★★★★★★★★★★★★」ArrayList.createWithCapacity(5),ArrayList.createWithContents(5),ArrayList.createWithInitialSize(5)즉, 프라이빗 컨스트럭터에서는 이름을 알기 쉬운 공장 함수를 제공할 수 있으며, 컨스트럭터를 프라이빗하게 함으로써 사용자는 보다 명확한 이름만을 사용할 수 있습니다.이것은 빌더 패턴에도 일반적으로 사용됩니다.예를 들어 다음과 같습니다.

    MyClass myVar = MyClass
        .newBuilder()
        .setOption1(option1)
        .setOption2(option2)
        .build();
    

(두 번째 포인트는)누군가 언급했을 거라고 생각했는데사설 컨스트럭터에는 다음 세 가지 용도가 있습니다.

  • 다음과 같은 경우 오브젝트 외부 인스턴스화를 방지합니다.

    • 싱글톤
    • 공장법
    • static-module-only(스태틱) 클래스
    • 는 constants-only class 입니다.
      .
  • 서브클래스컨스트럭터만 할 수 .이 수 입니다.super() 말은 '이렇게 하다'의 동의어느 의 동의어입니다.final

  • 오버로드된 컨스트럭터 - 메서드 및 컨스트럭터 오버로드로 인해 일부는 프라이빗이고 일부는 퍼블릭일 수 있습니다.특히 생성자에서 사용하는 비공용 클래스가 있는 경우 해당 클래스의 인스턴스를 만든 다음 개인 생성자에게 전달하는 공용 생성자를 만들 수 있습니다.

네, 할 수 있어요.프라이빗 컨스트럭터는 클래스가 인스턴스화되는 것을 방지하기 위해 존재하거나, 구축이 공장 패턴과 같은 내부에서만 이루어지기 때문에 존재하게 됩니다.상세한 것에 대하여는, 여기를 참조해 주세요.

네.

이는 클래스가 인스턴스화되는 방법을 제어할 수 있도록 하기 위한 것입니다.생성자를 비공개로 만든 다음 클래스의 인스턴스를 반환하는 표시 가능한 생성자 메서드를 만들면 생성자 수를 제한하거나(일반적으로 인스턴스가 정확히 하나임을 보장), 인스턴스 또는 기타 건설 관련 태스크를 재활용할 수 있습니다.

new x() 돌아오지 않다null, 할 수 null또는 다른 서브타입을 반환합니다.

유틸리티 함수 클래스와 같이 인스턴스 멤버나 속성이 없고 정적 멤버만 있는 클래스에도 사용할 수 있습니다.

클래스 내의 모든 메서드가 정적인 경우 프라이빗 컨스트럭터를 사용하는 것이 좋습니다.

네, 클래스에 개인 생성자가 있을 수 있습니다.추상 클래스도 개인 생성자를 가질 수 있습니다.

컨스트럭터를 비공개로 함으로써 클래스가 인스턴스화되는 것은 물론 해당 클래스의 서브클래스를 회피할 수 있습니다.

Private Constructor의 용도는 다음과 같습니다.

  1. 싱글톤 디자인 패턴
  2. 인스턴스 생성 수를 제한하려면 다음과 같이 하십시오.
  3. 정적 공장 방법을 사용하여 객체 작성에 의미 있는 이름을 지정하려면
  4. 정적 유틸리티 클래스 또는 상수 클래스
  5. 서브클래싱을 방지하려면
  6. Builder 설계 패턴, 따라서 불변의 클래스를 만들기 위한

Private Constructor는 다음과 같은 이유로 Java에서 정의될 수 있습니다.

  1. Java 객체의 인스턴스화를 제어하기 위해 객체의 인스턴스를 만들 수 없습니다.

  2. 클래스를 하위 분류할 수 없습니다.

  3. 이는 싱글톤 패턴을 구현할 때 특별한 이점이 있습니다. Private Contractor는 이 패턴에 사용되며 애플리케이션 전체의 인스턴스 작성을 제어할 수 있습니다.

  4. 클래스를 모든 상수로 정의하고 해당 인스턴스가 더 이상 필요하지 않은 경우 해당 클래스를 개인 생성자로 선언합니다.

네.

private constructor는 Java에서 사용하는 Math final 클래스와 같이 인스턴스가 초기화되지 않도록 하기 위해 사용됩니다.싱글톤은 개인 컨스트럭터도 사용합니다.

예, 클래스에는 개인 생성자가 있을 수 있습니다.다른 클래스에서 컨스트럭터에 액세스할 수 없도록 하고 정의된 클래스 내에서 계속 액세스할 수 있도록 해야 합니다.

클래스의 오브젝트를 내부에서만 작성하려고 하는 이유는 무엇입니까?이것은 어떠한 이유로도 실행할 수 있지만, 싱글톤을 실장하는 것이 원인일 가능성이 있습니다.싱글톤은 클래스의 인스턴스를 하나만 만들 수 있는 설계 패턴으로, 개인 생성자를 사용하여 만들 수 있습니다.

네, 컨스트럭터는 개인일 수 있습니다.Private Constructor는 다른 클래스가 Private Constructor의 예를 인스턴스화하는 것을 방지합니다.

public class CustomHttpClient {
private static HttpClient customHttpClient;

/** A private Constructor prevents any other class from instantiating. */
private CustomHttpClient() {
}}

컨스트럭터는 프라이빗하게 할 수 있습니까?개인 컨스트럭터는 어떻게 유용합니까?

네, 할 수 있어요.저는 이것이 유용한 또 다른 예라고 생각합니다.

//... ErrorType.java
public enum ErrorType {
    X,
    Y,
    Z
}

//... ErrorTypeException.java
import java.util.*;
import java.lang.*;
import java.io.*;

//Translates ErrorTypes only
abstract public class ErrorTypeException extends Exception {
    private ErrorTypeException(){}

    //I don't want to expose thse
    static private class Xx extends ErrorTypeException {}
    static private class Yx extends ErrorTypeException {}
    static private class Zx extends ErrorTypeException {}

    // Want translation without exposing underlying type
    public static Exception from(ErrorType errorType) {
        switch (errorType) {
            case X:
                return new Xx();    
            case Y:
                return new Yx();
            default:
                return new Zx();
        }
    }

    // Want to get hold of class without exposing underlying type
    public static Class<? extends ErrorTypeException> toExceptionClass(ErrorType errorType) {
        switch (errorType) {
            case X:
                return Xx.class;    
            case Y:
                return Yx.class;
            default:
                return Zx.class;
        }
    }
}

위의 경우 추상 클래스가 정적 내부 클래스 이외의 파생 클래스에 의해 인스턴스화되는 것을 방지합니다.추상 클래스는 최종 클래스가 될 수 없지만, 이 경우 개인 생성자가 내부 클래스가 아닌 모든 클래스에 대해 사실상 최종 클래스가 됩니다.

Private Constructor에 대한 자세한 내용은 Private Constructor에서 호출자에 의해 클래스가 명시적으로 인스턴스화되는 것을 방지합니다.

예, 인스턴스화와 이후 덮어쓰기를 방지하기 위해 사용됩니다.이것은 싱글톤 수업에서 가장 자주 사용된다.

Robert C에서 영감을 받았습니다.마틴의 "Clean Code"를 만지작거린 예:

/**
When overloading constructors, it is best practise to only allow the use of
different constructors than the standart one by explicitly enforcing the 
useage of a static function to highlight the use of the overloaded constructor

in example:
Animal a = Animal.CreateInsectOrArachnia(2, "black", 8); //hatch a black widow
*/


class Animal
{
   private int size;
   private String color;
   private int legs;

   public Animal(int size, String color)
   {
       this.size = size;
       this.color = color;
       this.legs = 4;
   }

   //will prevent the instanciation of Animal with this constructor
   private Animal(int size, String color, int legs)
   {
       this.size = size;
       this.color = color;
       this.legs = legs;
   }


   public static Animal CreateInsectOrArachnia(int size, String color, int legs)
   {
    return new Animal (size, color, legs);
   }

}

Martins는 사용자가 "스탠드 컨스트럭터" 이외의 컨스트럭터에 접속하는 것을 금지하고 정적 초기화 함수를 사용하여 "당신이 하는 일이 틀리지 않을 수 있지만 이 클래스의 예상 사용과는 다르다"는 점을 강조해야 한다고 명시하고 있다.

[그는 이 문구를 정확하게 사용하지 않았습니다.이 정의에 짜 넣으려고 했습니다-죄송합니다 Robert :^)]

참고로 클래스 내의 유일한 컨스트럭터(스탠다트 컨스트럭터라고도 함)를 프라이빗으로 완전히 선언하고 정적 함수로 클래스 인스턴스를 반환하는 것은 전혀 문제가 없습니다(싱글턴 패턴 참조).싱글톤 패턴을 실장하는 것은 매우 권장되지 않습니다.단, 통신이 한 방향으로만 흐르는 일부 사용 예(예: 로거 클래스 쓰기)를 제외합니다.

프라이빗 컨스트럭터를 갖는 배경에는 JVM에 의해 클래스의 인스턴스화를 외부에서 제한하는 것이 기본 아이디어이지만 클래스에 인수 컨스트럭터가 있는 경우에는 의도적으로 인스턴스화하고 있는 것으로 추측됩니다.

저에 따르면 컨스트럭터를 프라이빗으로 선언할 수 있습니다.또한 컨스트럭터를 선언한 후 클래스 오브젝트를 반환하는 클래스의 스태틱메서드를 사용하여 서브클래스에서 해당 클래스의 인스턴스를 취득할 수 있습니다.이 방법을 사용하여 에서 서브클래스로 분류합니다.classname.methodbzz 이것은 static 메서드이며 const를 선언하는 클래스의 인스턴스를 가져옵니다.

언급URL : https://stackoverflow.com/questions/2816123/can-a-constructor-in-java-be-private

반응형