자바에서는 몇 가지 프로젝트에서 사용하는 절차를 저장하기 위해 CommonExcelFunctions
클래스를 만들었습니다. 수업 중에는 추상적 인 절차가 없습니다. 이를 사용하려면 다른 프로젝트에서이 클래스를 확장해야하는지 또는 인스턴스화해야하고 인스턴스화 된 객체를 통해 인스턴스에 액세스해야하는지 결정하려고합니다. 어떤 방법이 가장 합리적인가?클래스의 프로 시저를 사용하려면 클래스를 확장하고 해당 클래스의 인스턴스를 만들 때 가장 좋은 시간은 언제입니까?
답변
항상은 상속에 대한 구성을 선호합니다. 새 클래스가 CommonExcelFunctions의 함수를 사용하는 'CommonExcelFunctions'가 아닙니다. 새 클래스의 인스턴스에서 CommonExcelFunctions의 함수를 호출하지 않을 것입니다. CommonExcelFunctions의 메소드로 새 클래스의 인터페이스를 오염시킬 필요가 없습니다. 그것은 캡슐화를 깨뜨릴 것입니다.
컴포지션을 사용할 때 모의 객체를 전달하는 CommonExcelFunctions를 사용하는 클래스를 쉽게 테스트 할 수 있습니다.
상속을 사용하면 클래스를 테스트하는 것이 매우 어렵습니다 (부분 테스트).
예를 들어 go language은 상속을 전혀 지원하지 않습니다.
유효한 자바 항목 16 "상속에 우선 적용"을 참조하십시오.
코드 재사용을 위해서만 상속을 사용하지 마십시오. 하위 클래스 관계는 특별히 is-a 관계 여야합니다. 특히 Java와 같은 언어에서 단일 상속 만 사용하는 경우에 그렇습니다.
그런 유틸리티 기능에 대해 정적이라고 묘사하는 것이 가장 좋을 것입니다. 그렇지 않은 경우 구성을 사용하여 멤버를 만듭니다.
당신을 감사합니다, 즉 내가 알고 싶은 무슨이다. 후속 질문, 내가 정적으로 사용하는 경우, 내가 함수를 사용해야 할 때마다 클래스 이름을 입력하지 않아도되는 방법이 있습니까? 사용할 수 있도록 만들 수 있습니까? FindLastRow(); 대신 : CommonExcelFunctions.FindLastRow(); –
예 참조 [정적 오기 (https://docs.oracle.com/javase/1.5.0/docs/guide/language/static-import.html)하지만 오염 리드로하는 매우 신중하게 사용되어야 로컬 네임 스페이스, 즉 야심적인 이름으로 실행될 수 있습니다. –
@AlexisKing에서 언급 한 것과 비슷한 유틸리티 클래스 (예 : ExcelFunctionsUtil
)를 만들고 거기에 static
개의 메소드를 만듭니다.이 코드는 여러 곳에서 재사용 할 때 유용하지만 상속에서는 사용할 수 없습니다. 부모 클래스의 확장 또는 하위 유형으로 간주 될 수있는 경우에만 상속을 이해할 수 있습니다. 예를 들어 UncommonExcelFunctions
클래스를 만든 경우 해당 자식이 CommonExcelFunctions
인 것으로 보이지만, 그러나 Accounting
클래스는 이해가되지 않습니다.
일반적으로 의심이들 때, 우리는 기초를 스스로 묻습니다. is-a
관계 또는 has-a
이 있습니까? nship.
새로운 수업이 CommonExcelFunction
클래스와 실제로 is-a
관계가있는 경우 확장 할 수 있습니다.
첫 번째 질문에 대한 답은 이며 가장 좋은 시간은입니다. 그렇지
그것은 유틸리티 클래스와 같은 역할을하고, 경우 자바에서 제공하는 것과 같은 몇 가지 예 (예 : Math.max
, Math.min
). 클래스의 메서드를 정적 (메서드 사용에 대한 인스턴스화 필요 없음)으로 구현할 수 있습니다.
이것에 대해 생각 :
Scanner scn = new Scanner(System.in); //Scanner class using instance methods
Math.max() //Math class using static methods
왜 자바 비 정적 동안의 Math class
정적로 스캐너의 메소드를 구현할까요? 당신은 그것에 대해 생각할 시간을 가졌다면 아마 답을 알고있을 것입니다. 우리가 예를 들어 직접 사용하고자하는 몇 가지 방법이있는 경우
그것은 필요가 없습니다 (숫자의 지수를 얻을를하는 value..etc 반올림, 두 수의 최대 수). (: 주사 콘솔 입력 파일로부터 검색 예)
그러나 그것은 (예Scanner class
)이 우리 스캐너 유형 이상의 필요할 수도 때 인스턴스 메소드를 작성하는 것이 더 이해된다. 당신이 할 수있는 경우
- 1. 클래스의 인스턴스를 만들 수 없습니다
- 2. 자바에서 클래스의 인스턴스를 만들 때 문제가 발생했습니다.
- 3. 클래스의 새 인스턴스를 만들 때 C# StackOverFlowException
- 4. 다른 클래스의 클래스를 사용하는 가장 좋은 방법
- 5. 당신과 같이 해당 클래스의 인스턴스를 만들 것이다, 오브젝티브 C
- 6. Perl에서 같은 클래스의 메서드 내에서 클래스의 인스턴스를 만들 수 있습니까?
- 7. 해당 클래스의 메서드 내에서 클래스의 개체를 만드는 것이 좋은 경우는 언제입니까?
- 8. 기본 클래스를 확장하는 모든 클래스의 인스턴스를 만듭니다.
- 9. 클래스를 인수로 전달해야하는시기는 언제입니까?
- 10. 해당 클래스의 인스턴스가있는 클래스를 다시 만들 수 있습니까?
- 11. 문자열 변수를 사용하여 클래스의 해당 인스턴스를 식별하십시오.
- 12. 클래스를 위임자로 지정하려면 클래스의 인스턴스를 만들어야합니까?
- 13. 클래스의 요소를 지정하는시기는 언제입니까?
- 14. 클래스의 속성을 선언하는시기는 언제입니까?
- 15. IOS에서 내 클래스의 인스턴스를 만드는 가장 좋은 방법은
- 16. BaseAdapter 클래스의 새 인스턴스를 만들 수 없습니다.
- 17. 저장된 프로 시저를 만드는 가장 좋은 방법
- 18. 클래스의 여러 인스턴스를 만들 수 없습니다.
- 19. 내부 정적 클래스의 인스턴스를 만들 수 있습니까?
- 20. Objective-c : 이제는 클래스의 인스턴스를 만들 수있게되었습니다.
- 21. 사용자 정의 클래스의 인스턴스를 만들 수 없습니다.
- 22. 지정된 클래스의 인스턴스를 만듭니다
- 23. 좋은 패턴 클래스 변수에 클래스의 인스턴스를 저장하는
- 24. 클래스의 인스턴스를 얻는 방법
- 25. 클래스의 인스턴스를 만드는 방법은 무엇입니까?
- 26. 파이썬 클래스의 '모드'변경을 처리하는 가장 좋은 방법
- 27. 클래스의 새 인스턴스를 만들 때 내 ArrayList 데이터가 소멸되지 않습니다.
- 28. 클래스의 새 인스턴스를 만들 때 Java 재정의 메서드
- 29. 내 클래스의 새 인스턴스를 만들 때 java.lang.NullPointerException이 발생하는 이유는 무엇입니까?
- 30. 주 템플릿에 클래스의 인스턴스를 만들 때 LNK2019 오류가 발생했습니다.
,이'static'을 만들 수있는 좋은 사례처럼 들리지만, 이러한 기능에 대한 실제 사용 사례를보고하거나이 방법을 구현하고하지 않고 조언을 제공하기 어렵다. –
여러분이 만든'CommonExcelFunctions'의 일부를 우리에게 보여줄 수도 있습니다. – user3437460
네, 다른 답변을 읽은 후에 정적이 제가하려고하는 것입니다. 때마다 클래스 이름을 입력하지 않도록하는 방법이 있습니까? 그래서 대신 INT S = CommonExcelFuntions.GetLastRowNum의(); 넣을 수 있습니다 : int s = GetLastRowNum(); ? –