source

왜 java.lang이야?객체가 추상적이지 않습니까?

manycodes 2023. 1. 9. 21:17
반응형

왜 java.lang이야?객체가 추상적이지 않습니까?

중복 가능성:
Java: 객체 클래스가 추상이라고 선언되지 않은 이유

오브젝트 클래스는 모두 자바에서 기본 클래스인데 추상 클래스가 아닌 이유는 무엇입니까?

정말 오랫동안 이 질문을 해왔는데 순전히 호기심 때문에 하는 질문이에요, 그게 전부에요.추상적이지 않기 때문에 내 코드나 누구의 코드도 깨지지 않는다. 하지만 왜 그들이 그것을 구체화했는지 궁금했다.

왜 누군가가 "인스턴스"를 원했을까요?이 오브젝트 클래스의 참조)한 가지 예는 잠금에 오브젝트 인스턴스를 사용하는 동기화 코드가 불량하다는 것입니다(적어도 한 번은 이렇게 사용했습니다).제 잘못입니다).

오브젝트 클래스의 "인스턴스"를 실제로 사용할 수 있습니까?인스턴스화는 OOP에 어떤 영향을 미칩니까?(물론 방법을 구현한 후) 추상적으로 표시했다면 어떻게 되었을까요?

★★★★★의 가 없는 java.lang.Object우리는 의견을 바탕으로 답을 해야 한다고 우리에게 말한다.몇 가지 질문으로 해결할 수 있습니다.

오브젝트 메서드 중 추상화하면 도움이 되는 것이 있습니까?

일부 방법이 이로 인해 이익을 얻을 것이라고 주장할 수 있다.hashCode() ★★★★★★★★★★★★★★★★★」equals()예를 들어, 둘 다 추상화되었더라면 이 두 가지 복잡성에 대한 좌절감이 훨씬 덜했을 것이다.이를 위해서는 개발자가 어떻게 구현해야 하는지 파악해야 하며, 이를 통해 일관성 있는 구현이 보다 명확해집니다(유효한 Java 참조).저는 오히려 '아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아.hashCode(),equals() ★★★★★★★★★★★★★★★★★」clone()별도의 옵트인 추상화(즉, 인터페이스)에 속합니다. 다른 방법으로는 른른른 the the the the the the the the.wait(),notify(),finalize()이미이 되지 않습니다

따라서 대답은 "아니오"가 될 것입니다. 오브젝트의 어떤 메서드도 추상적인 것으로부터 이익을 얻을 수 없습니다.

오브젝트 클래스를 추상적으로 표시하면 이점이 있습니까?

가정할 때 는 오브젝트 추상화( 추상화)를할 수 입니다.new Object()컴파일 에러입니다).이게 이득이 될까요?나는 "객체"라는 용어 자체가 추상적이기 때문에(주변에서 "객체"라고 완전히 표현할 수 있는 것을 찾을 수 있는가?) 객체 지향 패러다임에 들어맞는다고 생각한다.그러나 그것은 순수주의자적인 측면이다.개발자들에게 구체적인 하위 클래스, 심지어 빈 하위 클래스에 대한 이름을 선택하도록 강요하는 것은 그들의 의도를 더 잘 표현하는 코드를 만들 것이라고 주장할 수 있다.나는 패러다임 측면에서 완전히 맞기 위해서는 오브젝트에 표시를 해야 한다고 생각한다.abstract하지만 결국엔 실질적인 이점이 없습니다. 디자인 선호도의 문제(비실용과 순수성)입니다.

동기화를 위해 일반 객체를 사용하는 관행이 구체적인 이유를 충분히 제시합니까?

외 많은 은 '을 '만들다'에서 하는 것을 .synchronized(). 받아들여지고 , 추상적이기를 , 이 되는 것을 막을 생각합니다.이것이 일반적이고 받아들여지고 있는 관행이었을지 모르지만, 만약 디자이너가 오브젝트를 원했다면 오브젝트가 추상화되는 것을 막을 충분한 이유가 될 수 없다고 생각합니다. 때 빈이 있습니다(<고객명> > 른른 other otherclass 。그러나 이 서브클래스는 동작하지 않습니다.SDK에 빈 서브클래스가 제공되었을 가능성이 있습니다( ).java.lang.Lock동기화하고 싶을 때 언제든지 구성할 수 있습니다.이렇게 하면 더 강력한 의사표시를 만들 수 있다는 추가적인 이점이 있습니다.

오브젝트를 추상화함으로써 악영향을 받을 수 있는 다른 요인이 있습니까?

순수한 설계 관점과는 별도로 여러 영역이 있으며, 이는 선택에 영향을 미쳤을 수 있습니다.불행히도, 나는 그들에 대해 자세히 알 수 없다.그러나 다음 중 하나가 결정에 영향을 미친다고 해도 놀라지 않을 것입니다.

  • 성능
  • 보안.
  • JVM 구현의 단순성

다른 이유가 있을까요?

그것은 반성과 관련이 있을 수 있다고 언급되어 왔다.그러나 오브젝트가 설계되고 나서 반사가 도입되었습니다.그래서 그것이 반사에 영향을 미치는지 아닌지는 논란의 여지가 있다. 그것은 이유가 아니다.제네릭도 마찬가지입니다.

java.lang의 잊지 못할 포인트도 있습니다.오브젝트는 인간이 설계한 것입니다.실수를 했을 수도 있고 질문을 고려하지 않았을 수도 있습니다.결점이 없는 언어는 없습니다.그것들 중 하나일 수도 있지만, 만약 결점이 있다면 큰 언어는 아닙니다.그리고 저는 야망이 부족하지 않고 제가 널리 사용되는 기술의 핵심 부분을 설계하는 데 관여할 가능성은 매우 낮다고 말할 수 있습니다. 특히 15년(?) 동안 지속된 기술이지만 여전히 강력한 기술을 설계하는 데 관여할 가능성은 매우 낮습니다. 그래서 이것은 비판으로 여겨져서는 안 됩니다.

그렇게 말했으면 추상적으로 만들었을 것이다;-p

★★★
"java.java.java"는요?? "?"브젝 "" "" "" "" "?브젝 는?

의 플레인 java.lang.Object는 일반적으로 잠금/동기화 시나리오에서 사용되며, 이는 인정된 관행입니다.

또한 추상적인 이유는 무엇입니까?그 자체로는 충분히 기능하지 않기 때문에요?정말 추상적인 멤버들과 관련이 있을까요?그렇게 생각하지 않아.그래서 애초에 추상화하자는 주장은 존재하지 않습니다.그렇지도 않구나.

인 계층 를 예로 . 인 계급이 .Animal 이 논리는요.Animalclass abstract는 동물의 인스턴스가 더 나은 단어가 없기 때문에 사실상 '무효' 동물이기 때문이다(모든 방법이 기본 구현을 제공하더라도).★★★★★★★★★★★★★★★★ Object이치노애초에 추상적으로 만드는 압도적인 사례는 없다.

제가 읽어본 바로는Object 구체적일 필요는 없고, 사실 추상적이어야 한다.

구체적일 필요가 없을 뿐만 아니라, 조금 더 읽어본 결과, 나는 확신했다.Object 추상적이지 않은 것은 기본 상속 모델과 충돌합니다. 하위 클래스는 기능만 추가해야 하므로 구체적인 클래스의 추상 하위 클래스를 허용해서는 안 됩니다.
의 추상 경우는 .Object.

를 들 수 .Object도움이 됩니다.

  • 잠금과 동기화, 당신과 다른 논객들이 말한 것처럼.코드 냄새일 수도 있지만 오브젝트 인스턴스가 항상 이렇게 사용되는 것을 보았습니다.
  • Null 오브젝트로서의 이유equals틀리다
  • 더미 이나 배열을 더미 오브젝트.nulls.
  • 익명 클래스의 기본 인스턴스로 사용합니다.를 들면, '먹다'와 같이요.
    Object o = new Object() {...code here...}

추상화라고 선언해야 한다고 생각합니다만, 일단 실행되어 공개되면 큰 문제를 일으키지 않고 되돌리기가 매우 어렵습니다.Java Language Spec 13.4.1을 참조하십시오.

추상화되지 않은 클래스가 추상화라고 선언되도록 변경된 경우 해당 클래스의 새 인스턴스를 생성하려는 기존 이진 파일은 링크 시 InstantiationError를 발생시키거나 (반사 메서드를 사용하는 경우) InstantiationError를 발생시킵니다.실행 시 예외입니다.따라서 이러한 변경은 널리 분산된 클래스에서는 권장되지 않습니다."

자체 상태가 없는 일반 개체가 필요할 수 있습니다.언뜻 보기에는 쓸모없어 보이지만, 각각 다른 정체성을 가지고 있기 때문에 여전히 유용성이 있다.Tnis는 몇 가지 시나리오에서 도움이 됩니다.그 중 가장 중요한 것은 잠금입니다.두 개의 스레드를 조정하려고 합니다.Java에서는 잠금으로 사용되는 개체를 사용하여 이 작업을 수행합니다.오브젝트는 어떤 상태도 가질 필요가 없습니다.단순히 존재하기만 하면 잠금이 됩니다.

class MyThread extends Thread {
   private Object lock;
   public MyThread(Object l) { lock = l; }

   public void run() { 

      doSomething();
      synchronized(lock) {
          doSomethingElse();
      } 
   }
}

Object lock = new Object();
new MyThread(lock).start();
new MyThread(lock).start();

에서는 두 에 실행되지 했습니다.doSomethingElse()

오브젝트가 추상적이고 잠금이 필요한 경우 메서드나 필드를 추가하지 않고 서브클래스를 해야 잠금이 인스턴스화됩니다.

그러고 보니, 여기 두 가지 질문이 있습니다.오브젝트가 추상적인 경우 추상적인 메서드를 정의합니까?대답은 '아니오'인 것 같아요.이러한 상황에서는 클래스를 추상적으로 정의하는 것은 큰 가치가 없습니다.

나는 왜 대부분의 사람들이 모든 방법을 추상적으로 사용하는 완전 기능적인 수업을 만드는 것이 좋은 생각이라고 생각하는지 이해할 수 없다.
왜 추상적으로 만드는지 물어보고 싶군요.서는는 안능 ?능 ??? ???요한기 기여 ?여 ?여 ?? ???이 두 가지 질문 모두 '아니오'로 대답할 수 있습니다.그것은 그 자체로 완전한 노동계급이기 때문에 추상적인 것은 사람들이 빈 수업을 실행하는 것으로 이어집니다.

public class UseableObject extends AbstractObject{}

사용 가능한 오브젝트이 오브젝트는 기능을 추가하지 않으며 오브젝트에 의해 공개되는 메서드에 대한 접근을 허용하는 것이 유일한 이유입니다.
또한 "불량" 동기화 사용에 동의하지 않을 수 없습니다.개인 객체를 사용하여 액세스를 동기화하는 것은 동기화(이것)를 사용하는 것보다 안전하고 동시에 Java util concurrent에서 Lock 클래스를 사용하는 것보다도 사용하기 쉽습니다.

내가 보기엔 여기 실용성에 대한 간단한 질문이 있는 것 같아.클래스를 추상화하면 프로그래머가 무언가를 할 수 있는 능력, 즉 그것을 인스턴스화할 수 있는 능력이 없어집니다.추상적인 수업으로는 할 수 있는 일이 없고 구체적인 수업으로는 할 수 없는 일이 없다.(추상 함수를 선언할 수 있지만, 이 경우 추상 함수는 필요 없습니다.)구체화함으로써 유연성이 높아집니다.

물론 이를 구체화함으로써 초래된 적극적인 피해가 있다면 그 유연성은 단점이 될 것이다.하지만 오브젝트를 순간적으로 만드는 것에 의한 어떠한 적극적인 피해도 생각할 수 없습니다.('인스턴터블'이 단어인가요?상관없습니다.)누군가 raw Object 인스턴스를 사용한 것이 좋은 생각인지 아닌지에 대해 토론할 수 있습니다.그러나 지금까지 본 원시 객체 인스턴스의 모든 사용이 잘못된 생각이라고 설득할 수 있다고 해도, 여전히 좋은 사용법이 없을 수 있다는 것을 증명하지는 못할 것입니다.만약 그것이 아무 것도 해롭지 않고 도움이 될 수 있다면, 비록 지금 우리가 실제로 도움이 될 방법을 생각해 낼 수 없다고 해도, 왜 금지할까요?

지금까지의 답변은 모두 Java 1.0의 사용 상황을 잊어버린 것 같습니다.Java 1.0에서는 어나니머스 클래스를 만들 수 없었기 때문에 어떤 목적(동기화 또는 늘플레이스 홀더)의 오브젝트만 원하는 경우 해당 목적을 위한 클래스를 선언해야 합니다.그러면 많은 코드가 이 목적을 위한 추가 클래스를 갖게 됩니다.오브젝트를 직접 인스턴스화할 수 있도록 하는 것이 훨씬 더 간단합니다.

물론 현재 Java를 설계하고 있다면 누구나 다음과 같이 해야 한다고 말할 수 있습니다.

 Object NULL_OBJECT = new Object(){};

그러나 1.0에서는 이것이 선택사항이 아니었다.

설계자는 앞으로 오브젝트를 어떤 방식으로 사용할지 몰랐기 때문에 프로그래머에게 뮤텍스나 키 등 불필요한 클래스를 만들도록 강요하고 싶지 않았던 것 같습니다.

또한 배열로 인스턴스화할 수 있습니다.1.5일 전에 범용 데이터 구조를 사용할 수 있습니다.일부 플랫폼에서는 이 문제가 발생할 수 있습니다(J2ME라고 생각합니다만, 잘 모르겠습니다).

오브젝트가 구체화되어야 하는 이유.


  1. Object.getClass()"

  2. 범용 용도(Java 5 이전)

  3. /비교
    Object.toString(), Object.equals(), ."" ( ) "」

  4. (syncronization)
    Object.wait(), Object.notify() 입니다.

몇 개의 영역이 교체/폐지되었지만 모든 Java 클래스에 이러한 기능을 제공할 구체적인 부모 클래스가 여전히 필요했습니다.

오브젝트 클래스는 리플렉션에서 사용되며 코드는 'Object.class.getDeclaredMethods()'와 같은 불확정 유형의 인스턴스에서 메서드를 호출할 수 있습니다.오브젝트가 Abstract일 경우 참여하려는 코드는 클라이언트 코드가 리플리션을 사용하기 전에 모든 추상 메서드를 구현해야 합니다.

Sun에 따르면 추상 클래스는 추상이라고 선언된 클래스이며 추상 메서드를 포함할 수도 있고 포함하지 않을 수도 있습니다. 추상 클래스는 인스턴스화할 수 없지만 하위 클래스는 지정할 수 있습니다.이는 추상 클래스의 메서드를 호출하거나 공용 필드에 액세스할 수 없음을 의미합니다.

추상 루트 클래스의 예:

abstract public class AbstractBaseClass
{
    public Class clazz;

    public AbstractBaseClass(Class clazz)
   {
       super();
       this.clazz = clazz;
   }
}

Abstract Base Class의 하위 항목:

public class ReflectedClass extends AbstractBaseClass  
{
    public ReflectedClass() 
    {
       super(this);
    }

    public static void main(String[] args)  
    {
        ReflectedClass me = new ReflectedClass();
    }
}

같은 클래스의 다른 생성자를 호출하지 않는 한 생성자에서 'this'를 참조할 수 없으므로 컴파일되지 않습니다.다음과 같이 변경하면 컴파일할 수 있습니다.

   public ReflectedClass()
   {
       super(ReflectedClass.class);
   }  

그러나 Reflected Class에는 1) 구체적이고 2) 자녀용으로 유형을 저장하는 필드가 있는 상위("개체")가 있기 때문에 이 기능은 기능합니다.

보다 전형적인 반사의 예는 비정적 멤버 함수입니다.

public void foo()
{
    Class localClass = AbstractBaseClass.clazz;  
}

필드 'clazz'를 정적으로 변경하지 않으면 실패합니다.오브젝트의 클래스 필드의 경우 인스턴스 고유해야 하므로 이 필드는 작동하지 않습니다.오브젝트에 정적 클래스 필드가 있는 것은 의미가 없습니다.

다음 변경을 시도해보니 효과가 있지만 약간 오해의 소지가 있습니다.이 경우에도 기본 클래스를 확장해야 작동합니다.

public void genericPrint(AbstractBaseClass c)
{
    Class localClass = c.clazz;
    System.out.println("Class is: " + localClass);
}

public static void main(String[] args)
{
    ReflectedClass me = new ReflectedClass();
    ReflectedClass meTwo = new ReflectedClass();

    me.genericPrint(meTwo);
}

Java5 이전 세대(어레이와 마찬가지로)는 불가능했을 것입니다.

Object[] array = new Object[100];
array[0] = me;
array[1] = meTwo;

인스턴스는 실제 개체가 수신될 때까지 자리 표시자로 사용할 수 있도록 구성해야 합니다.

짧은 답변은 컬렉션 클래스가 Java 제네릭 이전 며칠 동안 유형 정보를 잃었다는 것입니다.컬렉션이 일반적이지 않은 경우 구체적인 오브젝트를 반환해야 합니다(실행 시 이전에 어떤 유형으로 다운캐스트됩니다).

구체적인 클래스를 추상 클래스로 만들면 바이너리 호환성이 깨지기 때문에(업스레드) 구체적인 오브젝트 클래스가 유지되었습니다.나는 그것이 동기화의 유일한 목적으로 만들어진 것이 아니라는 것을 지적하고 싶다. 더미 클래스도 마찬가지로 기능한다.

설계 결함에는 처음부터 제네릭이 포함되어 있지 않습니다.많은 디자인 비판이 그 결정과 그 결과를 겨냥하고 있다.[아, 그리고 배열 서브타이핑 규칙]

새로운 클래스를 만들 때마다 오브젝트 클래스가 확장되기 때문에 추상적이지 않습니다.추상적인 경우 오버헤드인 오브젝트 클래스의 메서드를 모두 구현해야 합니다.해당 클래스에 이미 구현된 메서드가 있습니다.

언급URL : https://stackoverflow.com/questions/2117689/why-java-lang-object-is-not-abstract

반응형