C #에서 Java로 전환하십시오. 어떤“gotchas”를주의해야합니까?


9

새 프로젝트를 위해 Java로 전환해야 할 수도 있습니다. 나는 주로 C #을 연구하고 사용했기 때문에 Java에 대한 지식이 거의 없으며이 두 언어 / 플랫폼의 차이점으로 인해 많은 문제가 발생할 가능성이 있습니다.

내가 염두에 두어야 할 함정은 무엇입니까?


나는이 블로그가 당신이 찾고있는 많은 것들을 다룬다 고 생각합니다. ericsink.com/entries/java_eclipse_2.html
Hari Menon

3
C #과 Java 사이 에는 많은 차이점이 있으며 모든 질문은이 질문에 대한 잠재적 인 "답"입니다. 그러나 나는 그것이 당신이나 다른 사람들에게 매우 유용 할 것이라고 의심합니다. 보다 구체적이고 실제적인 질문을하면보다 유용한 답변을 얻을 수 있습니다. 또는 (효과적으로 끝이없는) 차이점보다는 C #에서 Java로 전환 하기 위한 참조 또는 안내서 를 요청 하십시오.

다시 말해, 특정 문제에 대해 "왜"또는 "어떻게"라는 질문 을하는 것이 좋습니다. 예를 들어, 참조, 안내서 또는 서적을 요청하는 것은 "C #에서 Java로 전환하는 방법"을 묻는 것과 같거나 이해하지 못하는 특정 코드에 대한 질문은 "Y 대신 X를 수행하는 이유"질문입니다.

이 커뮤니티 위키를 만들어보십시오
finnw

답변:


36

C #에서 올 때 중요한 Java 문제는 다음과 같습니다.

  • Java에서는 switch사례가 다음 단계로 자동으로 넘어갈 수 있으므로 break필요할 때마다 항상 배치해야합니다 . 당신은 또한 할 수 없습니다 switch에서와 String자바있다.
  • 제네릭은 비 유형화되고 참조 유형으로 만 매개 변수화 할 수 있습니다. 더 없다 List<int>, 단지를 List<Integer>. 오토 박싱은 자세한 내용을 숨기지 만 NullPointerExceptiona를 개봉하면 얻을 수 있습니다 null. 또한, ==!=두 박스형 프리미티브 유형 기준 비교를 수행한다.
    • ... ==그리고 !=두 개의 참조 유형 (예 :) String이 항상 참조 비교 이므로
    • int자동 상자를 넣을 수 있습니다 Integer. 에서 int[]까지 자동 박스가 없습니다 Integer[].
  • 자바의 byte, short, int, long만 서명됩니다. 의도하지 않은 부호 확장을 확인하십시오.
  • 다차원 배열은없고 Java 배열 만 배열합니다.
  • 대부분의 sub*원거리 쿼리 방법은 포괄적 인 하한 및 독점 상한을 사용합니다.

또한보십시오

관련 질문

위에 나열된 일부 주제에서 :

일반적인 Java 문제 :


8
이제 Java SE 7에서 문자열을 켤 수 있습니다.
Malcolm

+1 제네릭 비 구체화 만 참조 형식으로 파라미터 화된다 , 이것은 나에게 많은 오늘 도움
cctan

또한 java에는 구조체가 없습니다를 추가해야합니다.

13

한 가지 명백한 함정은 문자열 string1 == string2을 Java style 대신 C # 스타일 (Java는 참조 만 비교)과 비교하는 것입니다 string1.equals(string2).

다른 하나는 Java private에서 C #의 기본 액세스 수정 자입니다 package.

또한 ToString()메소드는 Java의 현재 문화권에 의해 자동으로 현지화되지 않습니다.


이것은 운영자 과부하가 없다는 사실의 확장입니다.
Graphain

3
잘못된. 패키지 전용은 Java의 기본 액세스 수정 자입니다.
Oliver Weiler

@Helper Method : 아 죄송합니다. C #은 기본적으로 비공개이지만 Java는 아닙니다. 이제 편집되었습니다.

12

나를 얻은 것은 Java 하위 문자열 인수는 beginIndex, endIndex이고 C # Subtring 인수는 startIndex, length입니다. 그것은 귀찮게하기에 충분한 차이와 스위치를 전환 할 때 범위를 벗어나는 인덱스를 얻을 수있는 좋은 기회입니다.


3
+1 더 혼란스러운 점은 beginIndex INCLUSIVE 및 endIndex EXCLUSIVE이며 JDK에서 startIndex, length 접근 방식을 사용하는 API가 있다는 것입니다.
Oliver Weiler

10
  • LINQ가 없습니다
  • UI가 좋지 않음-WPF 없음
  • 속성이 없습니다
  • 이집트인 춤을 추다
  • 예제와 좋은 문서없이 API를 얻습니다.

흠.


2
Java API가 잘못되었음을 발견하지는 않았지만 (실제로 탐색하기가 쉽지만) 확실히 적은 예제가 있습니다. 이것은 이집트인에 대한 무엇입니까?
Graphain

3
나는 비꼬는 낮은 타격에도 불구하고 이것을 찬성하고 있습니다.
mpen


8
이러한 진정한 함정입니까? 함정을 버그의 가능한 원인으로 이해합니다. 이것들은 다른 방법으로는 할 수 없으므로 함께 살아야 할 것들입니다.

2
@cloudanger : 동의합니다. 함정은 잘못 작동하는 것이 아니라 잘못 "작동하는"것이어야합니다.
Vimvq1987

10
  • Java 열거 형은 훨씬 강력하고 복잡하며 실제로는 명명 된 정수 대신 실제 클래스입니다.
  • 자바의 내부 클래스는 더 강력합니다 (그리고 다르게 행동합니다)
  • 델리게이트 없음, 기능적 오브젝트 만
  • 생성자 체인 관련 사항은 두 언어에서 완전히 다른 구문을 가지고 있습니다 .C #에서 그렇게해야 할 때마다 실패하는 경향이 있습니다.
  • Java는 서브 클래 싱을 확장하고 인터페이스를 구현합니다. 대신 C #은 인터페이스가 이름에서 대문자 I로 시작한다는 명명 규칙을 따릅니다. 다른 사람이 실패하면 확신 할 수 없기 때문에 나는 그 협약을 좋아하지 않습니다.
  • 자바 오토 박싱은 a **
  • 자바 타입 삭제는 실제로 일을 더 복잡하게 만듭니다.

2
농담하는 거지? 그러나 -1입니다. 당신은 진지 할 수 없습니다.

3
적어도 당신이 싫어하는 점을 분명히해야합니다. 그렇지 않으면 나는 당신이 단지 트롤링한다고 가정해야합니다.
atamanroman

2
이제 당신의 농담뿐만 아니라 당신은 단지 무지합니다 : 리눅스는 백엔드 영역에서 중요합니다. javadoc은 네트워크 공유에서 볼 때 작동하지 않는이 바보 같은 MS 도움말 파일보다 훨씬 깨끗합니다. sandcastle은 문서화되지 않았으며 적절한 GUI 없이는 완전히 사용할 수 없습니다. 대부분의 ppl은 자바 프레임 워크에 정말 멋진 컬렉션이 있으며 joshua bloch가 멋진 일을 한 것에 동의합니다. "이그 헤드"책은 이해하기 어려운 책입니다. 이클립스는 VS가 외부 플러그인없이 견딜 수없는 멋진 IDE입니다. Btw : 나는 C #을 좋아하고 java에서 linq를 그리워합니다. ms-office-world에서 벗어나십시오.
atamanroman

1
만 이러한 항목 중 하나는 잡았다이다
finnw

1
나도 -1, 당신은 좋은 아이디어가 무엇인지 알지 못하므로 프로그래밍과 관련된 많은 것을 알지 못합니다. 편집 : Pffft Java가 더 성숙하고 Java에는 실제 제네릭조차 없습니다.

6

가장 큰 메타 함정은 Java 언어 및 라이브러리가 C #에서 비슷한 모양으로 동작 한다고 가정 하는 것입니다. 자습서를 수행하고 javadoc을 읽고 가정하지 마십시오 ...

또 다른 메타 함정은 가정하는 것입니다 당신이 자바에서 뭔가를 할 수 있다는 사실 똑같이 당신은 /는 C #에서 할 수 가능한 한 정중하게 / 쉽게. 사실이 아닙니다. Java는 훨씬 오래된 언어이며 실수가 발생했습니다 ...

그리고 마지막 메타 함정은 Java에서 누락되거나 다른 것들에 대해 불평하면 SO에 보편적으로 동정적 /지지적인 응답 을 줄 것이라고 생각 하는 입니다!


3

기본 액세스 수정 자의 차이점을주의하십시오. 또한 Java의 모든 비 정적 메소드는 가상입니다 (최종으로 표시하지 않는 한).

다소 오래되었지만, 이것이 훌륭한 참고 자료라는 것을 알았습니다.

Dare Obasanjo의 C #과 Java 비교


3
Also note that all non-static methods in Java are virtual.내가 C #도 좋아했으면 좋겠다
Graphain

3
그것이 OOP의 이유를 파괴하기 때문에 그것이 기쁘지 않습니다. 기본적으로 모든 메소드가 가상 인 경우 기본적으로 전체 클래스를 대체 할 수 있습니다. 일반적으로 원하지 않는 방식입니다. 또한 비 최종에서 최종으로 메소드를 변경하면 코드 파생이 중단 될 수 있지만 다른 방법으로는 그렇지 않습니다.
Femaref


0

나는 당신의 질문이 주관적이라고 생각합니다. 여기에서는 모두 설명 할 수 없습니다. 난 당신이 읽을 제안 자바 퍼즐 러 (Puzzler)을 하여 Joshua Bloch and Neal Gafter. 함정에서 더 많은 것을 배우고 안전 할 수 있습니다.


모든 함정은 아니지만 C # 프로그래머 인 함정은 Java에서 만들 가능성이 높습니다.
Vimvq1987

1
@ Vimvq1987-Java로 전환 한 후 "Java Puzzlers"함정에 빠지지 않는다고 가정 할 이유가 없습니다.
Stephen C

-1

Java 언어에서 int, char와 같은 기본 유형의 객관적인 동등 항목은 "값 유형"이 아닙니다 (예 : Integer는 참조 유형). C #에서 System.Int32는 구조입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.