2015-01-21 2 views
4

자바에서는 몇 가지 프로젝트에서 사용하는 절차를 저장하기 위해 CommonExcelFunctions 클래스를 만들었습니다. 수업 중에는 추상적 인 절차가 없습니다. 이를 사용하려면 다른 프로젝트에서이 클래스를 확장해야하는지 또는 인스턴스화해야하고 인스턴스화 된 객체를 통해 인스턴스에 액세스해야하는지 결정하려고합니다. 어떤 방법이 가장 합리적인가?클래스의 프로 시저를 사용하려면 클래스를 확장하고 해당 클래스의 인스턴스를 만들 때 가장 좋은 시간은 언제입니까?

+0

,이'static'을 만들 수있는 좋은 사례처럼 들리지만, 이러한 기능에 대한 실제 사용 사례를보고하거나이 방법을 구현하고하지 않고 조언을 제공하기 어렵다. –

+0

여러분이 만든'CommonExcelFunctions'의 일부를 우리에게 보여줄 수도 있습니다. – user3437460

+0

네, 다른 답변을 읽은 후에 정적이 제가하려고하는 것입니다. 때마다 클래스 이름을 입력하지 않도록하는 방법이 있습니까? 그래서 대신 INT S = CommonExcelFuntions.GetLastRowNum의(); 넣을 수 있습니다 : int s = GetLastRowNum(); ? –

답변

0

항상은 상속에 대한 구성을 선호합니다. 새 클래스가 CommonExcelFunctions의 함수를 사용하는 'CommonExcelFunctions'가 아닙니다. 새 클래스의 인스턴스에서 CommonExcelFunctions의 함수를 호출하지 않을 것입니다. CommonExcelFunctions의 메소드로 새 클래스의 인터페이스를 오염시킬 필요가 없습니다. 그것은 캡슐화를 깨뜨릴 것입니다.

컴포지션을 사용할 때 모의 객체를 전달하는 CommonExcelFunctions를 사용하는 클래스를 쉽게 테스트 할 수 있습니다.

상속을 사용하면 클래스를 테스트하는 것이 매우 어렵습니다 (부분 테스트).

예를 들어 go language은 상속을 전혀 지원하지 않습니다.

유효한 자바 항목 16 "상속에 우선 적용"을 참조하십시오.

+2

'항상'적절하다고 생각하지 않습니다. 대부분의 경우 그렇습니다. 그러나 항상 그런 것은 아닙니다. – Sid

+1

나는 "항상 사용"없습니다 "항상 좋아한다"고 말했다 : P – woru

4

코드 재사용을 위해서만 상속을 사용하지 마십시오. 하위 클래스 관계는 특별히 is-a 관계 여야합니다. 특히 Java와 같은 언어에서 단일 상속 만 사용하는 경우에 그렇습니다.

그런 유틸리티 기능에 대해 정적이라고 묘사하는 것이 가장 좋을 것입니다. 그렇지 않은 경우 구성을 사용하여 멤버를 만듭니다.

+0

당신을 감사합니다, 즉 내가 알고 싶은 무슨이다. 후속 질문, 내가 정적으로 사용하는 경우, 내가 함수를 사용해야 할 때마다 클래스 이름을 입력하지 않아도되는 방법이 있습니까? 사용할 수 있도록 만들 수 있습니까? FindLastRow(); 대신 : CommonExcelFunctions.FindLastRow(); –

+0

예 참조 [정적 오기 (https://docs.oracle.com/javase/1.5.0/docs/guide/language/static-import.html)하지만 오염 리드로하는 매우 신중하게 사용되어야 로컬 네임 스페이스, 즉 야심적인 이름으로 실행될 수 있습니다. –

2

@AlexisKing에서 언급 한 것과 비슷한 유틸리티 클래스 (예 : ExcelFunctionsUtil)를 만들고 거기에 static 개의 메소드를 만듭니다.이 코드는 여러 곳에서 재사용 할 때 유용하지만 상속에서는 사용할 수 없습니다. 부모 클래스의 확장 또는 하위 유형으로 간주 될 수있는 경우에만 상속을 이해할 수 있습니다. 예를 들어 UncommonExcelFunctions 클래스를 만든 경우 해당 자식이 CommonExcelFunctions 인 것으로 보이지만, 그러나 Accounting 클래스는 이해가되지 않습니다.

1

일반적으로 의심이들 때, 우리는 기초를 스스로 묻습니다. 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)이 우리 스캐너 유형 이상의 필요할 수도 때 인스턴스 메소드를 작성하는 것이 더 이해된다. 당신이 할 수있는 경우

관련 문제