关于Blackberry:为C#家伙真正使用Java-ME的最佳方法

关于Blackberry:为C#家伙真正使用Java-ME的最佳方法

Best way to really grok Java-ME for a C# guy

我最近开始为Blackberry开发应用程序。因此,我不得不跳到Java-ME并学习该语言及其相关工具。语法很简单,但是我仍然遇到各种陷阱和环境问题。

例如,令我惊讶并浪费大量时间的是类对象上缺少实际属性(我以为所有OOP语言都具有这种属性)。有很多陷阱。我去过很多地方,他们将Java语法与C#进行比较,但是似乎没有任何网站可以说明在迁移到Java时需要注意的事情。

环境是另一个整体。 Blackberry IDE简直太恐怖了。外观使我想起适用于Windows 3.1的Borland C ++-那已经过时了。其他一些问题还包括斑点的智能感知,弱调试等。Blackberry确实具有Eclipse插件的beta版本,但是没有调试支持,它只是一个带有精美重构工具的编辑器。

那么,关于如何融入Java-ME的任何建议?


这里的这个人必须进行逆转换。因此,他列出了Java和C#的十大区别。我将讨论他的主题,并展示它是如何用Java制成的:

陷阱#10-给我我的标准输出!

要使用Java打印到标准输出:

1
System.out.println("Hello");

陷阱#9-命名空间==自由

在Java中,您没有命名空间的自由。您的类的文件夹结构必须与程序包名称匹配。例如,包org.test中的类必须位于org / test文件夹中

陷阱#8-超级发生了什么?

在Java中引用超类时,使用保留字super而不是base

难题#7-将构造函数链接到基本构造函数

您在Java中没有这个。您必须自己调用构造函数

陷阱#6-Dagnabit,我该如何继承现有的课程?

要在Java中子类化,请执行以下操作:

1
2
public class A extends B {
}

这意味着类A是类B的子类。在C#中将是class A : B

难题#5-为什么常量不保持不变?

要在Java中定义常量,请使用关键字final代替const

陷阱#4-ArrayListVectorHashtable在哪里?

Java中最常用的数据结构是HashSetArrayListHashMap。它们实现了SetListMap。当然,还有更多。在这里阅读更多关于收藏的信息

陷阱#3-存取器和变异器(字母和二传手)

您没有Java中的属性工具。您必须自己声明gets和set方法。当然,大多数IDE都可以自动执行此操作。

陷阱#2-我无法覆盖!?

您无需在Java中声明方法virtual。所有方法(声明为final的方法除外)都可以在Java中覆盖。

还有#1陷阱...

在Java中,原始类型intfloatdoublecharlong与C#中的Object不同。它们都有各自的对象表示形式,例如Integerfloatdouble等。

而已。不要忘记查看原始链接,这里有更详细的讨论。


Java与C#并没有太大区别。在纯粹的语法层面上,以下是一些可能使您精通一天的指针:

好。

  • 在Java中,您有两个异常家族:java.lang.Exception及其衍生的一切,以及RuntimeException。这很有意义,因为在Java中检查了异常。这意味着,为了抛出任何非运行时异常,您还需要在方法声明中添加throws批注。因此,使用您的方法的任何方法都必须捕获该异常或声明它也引发相同的异常。实际上,很多异常(例如NullPointerExceptionIllegalArgumentException)都是从RuntimeException派生的,因此您无需声明它们。受检查的异常是两个学科之间的争论点,因此,我建议您亲自尝试一下它们,看看它是否对您有所帮助或使您烦恼。从个人的角度来看,我认为检查异常可以显着改善代码分解和健壮性。

    好。

  • 尽管Java支持自动装箱已经有一段时间了,但是您应该意识到C#和Java实现之间仍然存在许多差异。在C#中,您可以将int用作值类型和引用类型,而在Java中,它们实际上不是同一类型:您可以得到原始值类型int和库引用类型java.lang.Integer。这以两种常见的方式表现出来:不能将值类型用作通用类型参数(因此将使用ArrayList而不是ArrayList)和实用程序方法(例如parsetoString )以引用类型静态实现(因此它不是int a; a.toString();而是int a; Integer.toString( a );)。

    好。

  • Java有两种不同类型的嵌套类,C#只有一种。在Java中,未使用static修饰符声明的静态类称为内部类,并且可以隐式访问封闭类的实例。这一点很重要,因为Java与C#不同,它没有委托的概念,并且内部类经常用于以相同的语法痛苦实现相同的结果。

    好。

  • Java中的泛型与C#的实现方式根本不同。当为Java开发泛型时,为了保持与旧版VM的向后兼容性,决定所做的更改纯粹是语法上的,没有运行时支持。由于在运行时中没有直接的泛型支持,Java使用称为类型擦除的技术来实现泛型。与C#泛型实现相比,类型擦除有很多缺点,但是最重要的一点是Java中的参数化泛型类型没有不同的运行时类型。换句话说,编译后类型ArrayListArrayList是等效的。如果您大量使用泛型,则会比您想象的要早得多地遇到这些差异。

    好。

  • 在我看来,C#开发人员最难以理解的是语言的三个方面。除此之外,还有开发工具和类库。

    好。

  • 在Java中,包(名称空间),类名和文件名之间存在直接关联。在公共根目录下,类com.example.SomeClassorg.apache.SomeOtherClass将分别在com/example/SomeClass.classorg/apache/SomeOtherClass.class中找到。谨慎尝试在单个Java文件中定义多个类(私有类是可能的,但不建议使用),并坚持使用此目录结构,直到您对开发环境更加满意为止。

    好。

  • 在Java中,您具有不容易映射到C#的类路径和类加载器的概念(有些粗略的等效项对于大多数.NET开发人员而言并不常见)。 Classpath告诉Java VM在何处可以找到库和类(包括您的库和系统的共享库!),并且您可以将类加载器视为类型所在的上下文。类加载器用于从各个位置(本地磁盘,Internet,资源文件等)加载类型(类文件),但也限制了对这些文件的访问。例如,诸如Tomcat之类的应用程序服务器将为每个已注册的应用程序或上下文提供一个类加载器。这意味着应用程序A中的静态类将与应用程序B中的静态类不同,即使它们具有相同的名称并且共享相同的代码库也是如此。 AppDomain在.NET中提供了一些类似的功能。

    好。

  • Java类库类似于BCL。许多差异都是外观上的差异,但这足以使您一次又一次地运行文档(和/或Google)。不幸的是,我不认为这里有什么事可做-您随即会熟悉这些库。

    好。

  • 底线:使用Java是唯一的方法。学习曲线并不陡峭,但是在使用的前两三个月中,经常会感到惊讶和沮丧。

    好。

    好。


    简短的答案是-这将很烦人,但并不困难。

    Java和C#具有相同的基础概念,并且许多库的样式都非常接近,但是您将不断遇到各种差异。

    如果您在谈论类属性,那么Java具有那些。语法是

    1
    2
    3
    public class MyClass {
        public static int MY_CLASS_PROPERTY = 12;
    }

    我会认真建议您获得更好的IDE。
    Netbeans,Eclipse,IDEA,JBuider中的任何一个都将使您的过渡更加愉快。


    推荐阅读