Questions tagged «java»

Java是最初由Sun Microsystems开发的高级,独立于平台的,面向对象的编程语言。Java目前归甲骨文所有,甲骨文于2010年收购了Sun。

8
将源代码转换为Java字节码有什么用?
如果对于不同的体系结构需要不同的JVM,我无法弄清楚引入这一概念的逻辑是什么。在其他语言中,我们需要用于不同机器的不同编译器,但是在Java中,我们需要不同的JVM,那么引入JVM概念或此额外步骤的逻辑是什么?
37 java  jvm  bytecode 

9
学校为什么要在List上教数组?[关闭]
我学校中大部分的初始编程课程作业都要求我使用数组。我现在全职工作,而且从未将数组用于我从事的任何项目。即使在现有的项目中,我也从未见过在任何地方使用数组。我认为,List更易于使用,是一个标准。教授为什么要告诉学生在作业中使用数组?只是为了让学生了解基础知识? 由于大多数大学都教授Java,因此这个问题是Java特有的。

3
使用peek()修改流元素是否是反模式?
假设我有一个事物流,并且想在流中“丰富”它们,我可以使用peek()它,例如: streamOfThings.peek(this::thingMutator).forEach(this::someConsumer); 假设在代码的这一点上对事物进行变异是正确的行为-例如,该thingMutator方法可以将“ lastProcessed”字段设置为当前时间。 但是,peek()在大多数情况下,它的意思是“看起来,但不要碰”。 是使用peek()到发生变异流元素的反模式或不明智的? 编辑: 另一种更常规的方法是转换消费者: private void thingMutator(Thing thing) { thing.setLastProcessed(System.currentTimeMillis()); } 到返回参数的函数: private Thing thingMutator(Thing thing) { thing.setLastProcessed(currentTimeMillis()); return thing; } 并map()改用: stream.map(this::thingMutator)... 但这会引入敷衍的代码(return),但我不认为它会更清晰,因为您知道peek()返回的对象相同,但是map()乍一看并不清楚它是同一类对象。 此外,使用peek()lambda可以突变,但是map()您必须构建火车残骸。比较: stream.peek(t -> t.setLastProcessed(currentTimeMillis())).forEach(...) stream.map(t -> {t.setLastProcessed(currentTimeMillis()); return t;}).forEach(...) 我认为peek()版本更清晰,lambda也很明显是变异的,因此没有“神秘的”副作用。同样,如果使用方法引用,并且该方法的名称明确暗含了突变,则该名称也很明显。 就个人而言,我不会回避使用peek()变异-我觉得这很方便。

5
什么时候应该扩展Java Swing类?
我对继承实现的当前理解是,只有存在IS-A关系时,才应该扩展类。如果父类可以进一步具有具有不同功能的更特定的子类型,但将共享在父类中抽象的公共元素。 我质疑这种理解,因为我的Java教授建议我们这样做。他建议JSwing我们在课堂上建立一个应用程序 一个都应该延伸JSwing类(JFrame,JButton,JTextBox等)到单独的自定义类和在其中指定GUI相关的定制(例如部件尺寸,部件的标签,等) 到目前为止还算不错,但是他进一步建议每个JButton应该有自己的自定义扩展类,即使唯一的区别是标签。 例如,如果GUI有两个按钮,则“ 确定”和“ 取消”。他建议应将它们扩展如下: class OkayButton extends JButton{ MainUI mui; public OkayButton(MainUI mui) { setSize(80,60); setText("Okay"); this.mui = mui; mui.add(this); } } class CancelButton extends JButton{ MainUI mui; public CancelButton(MainUI mui) { setSize(80,60); setText("Cancel"); this.mui = mui; mui.add(this); } } 如您所见,唯一的区别在于setText功能。 那么这是标准做法吗? 顺便说一句,讨论该课程的课程称为Java最佳编程实践 [教授回覆] 因此,我与教授讨论了这个问题,并提出了答案中提到的所有观点。 他的理由是子类在遵循GUI设计标准的同时提供了可重用的代码。例如,如果开发人员在一个窗口中使用了自定义Okay和Cancel按钮,则将相同的按钮放置在其他Windows中也将变得更加容易。 我知道了我想起的原因,但它仍然只是在利用继承并使代码易碎。 …

9
算法比编程语言重要吗?
在当前(2013年)的Google Code Jam竞赛中,与仅使用40行代码即可解决同一问题的Python人员相比,C ++和Java人员花费了200多行代码。 Python不能直接与C ++和Java相提并论,但是我认为冗长程度的差异可能会对算法的效率产生影响。 与选择语言相比,知道正确的算法有多重要?能否以更好的方式(使用相同的算法)以C ++或Java来实现出色实现的Python程序,这是否与某些编程语言的自然冗长性有关?
35 java  c++  algorithms  python 

2
为新项目选择JAX-RS实现
我正在启动一个新的Java项目,该项目需要RESTful API。它将是为移动客户提供服务的SaaS业务应用程序。 我已经用Java EE 6开发了一个项目,但是我对生态系统不是很熟悉,因为我的大部分经验都在Microsoft平台上。 对于诸如所述的新项目,对于JAX-RS实现,哪个选择是明智的选择? 从维基百科的列表来看,主要竞争者似乎是Jersey,Apache CXF,RESTeasy和Restlet。但是Wikipedia上引用的JAX-RS实现的比较是从2008年开始的。 他们各自的主页给我的第一印象是: CXF的目标是成为一个非常全面的解决方案(使我想起了Microsoft领域的WCF),这使我认为,理解,设置和调试它可能比我需要的更为复杂。 Jersey是参考实现,可能是一个不错的选择,但是它是Sun的遗留产品,我不确定Oracle如何对待它(公告页面不起作用,最后一次提交通知是在4个月前)。 RESTeasy来自JBoss,可能是一个不错的选择,尽管我不确定学习曲线。 Restlet似乎很流行,但是有很多历史,我不确定它在Java EE 6世界中是最新的还是不确定它是否带有沉重的J2EE思维方式(例如许多XML配置)。 这些替代方案的优点是什么?那学习曲线呢?功能支持?工具(例如NetBeans或Eclipse向导)?调试和部署的便利性如何?这些项目中的任何一个是否比其他项目更新?它们的稳定性如何?
35 java  rest  java-ee 

3
OO中传递的消息是什么?
我一直在研究OO编程,主要使用C ++,C#和Java。我以为我对封装,继承和多态性有了很好的了解(以及在此站点上阅读了很多问题)。 似乎突然出现的一件事是“消息传递”的概念。显然,在以当今主流语言进行OO编程时,并没有使用此方法,但是Smalltalk支持了这种方法。 我的问题是: 什么是消息传递?(有人可以举一个实际的例子吗?) C ++,C#或Java是否支持这种“消息传递”?
35 java  c#  c++  object-oriented 

5
如何处理永远不会抛出的检查异常
例: foobar = new InputStreamReader(p.getInputStream(), "ISO-8859-1"); 由于编码是经过硬编码且正确的,因此构造函数将永远不会抛出规范中声明的UnsupportedEncodingException(除非Java实现被破坏,否则无论如何我都会迷路)。无论如何,Java仍然迫使我处理该异常。 目前看来 try { foobar = new InputStreamReader(p.getInputStream(), "ISO-8859-1"); } catch(UnsupportedEncodingException e) { /* won't ever happen */ } 任何想法如何使它变得更好?


8
强迫其他开发人员在完成工作后调用方法
在Java 7的库中,我有一个为其他类提供服务的类。创建此服务类的实例后,可以多次调用该服务类的一个方法(将其称为doWork()方法)。因此,我不知道服务类的工作何时完成。 问题在于服务类使用重对象,并且应该释放它们。我在方法中设置了这一部分(我们称它为release()),但不能保证其他开发人员将使用此方法。 有没有一种方法可以迫使其他开发人员在完成服务类任务后调用此方法?我当然可以记录下来,但是我想强迫他们。 注意:我无法在release()方法中调用该方法doWork(),因为doWork() 在下一次调用该方法时需要这些对象。
34 java 

6
使用两个队列实现堆栈的意义何在?
我有以下作业问题: 使用两个队列实现堆栈方法push(x)和pop()。 我觉得这很奇怪,因为: 堆栈是(LIFO)队列 我不明白为什么您需要两个队列来实现它 我到处搜寻: 极客 堆栈溢出 并找到了一些解决方案。我最终得到的是: public class Stack<T> { LinkedList<T> q1 = new LinkedList<T>(); LinkedList<T> q2 = new LinkedList<T>(); public void push(T t) { q1.addFirst(t); } public T pop() { if (q1.isEmpty()) { throw new RuntimeException( "Can't pop from an empty stack!"); } while(q1.size() > 1) …
34 java  stack 

8
重写Object.finalize()真的不好吗?
反对重写的两个主要论点Object.finalize()是: 您不必决定何时调用它。 它可能根本不会被调用。 如果我正确理解了这一点,我认为这些理由不足以令人讨厌Object.finalize()。 由VM实施和GC决定何时分配对象的正确时间,而不是开发人员。为什么决定何时Object.finalize()打电话很重要? 通常,如果我错了,请纠正我,唯一的一次Object.finalize()调用是在GC有机会运行之前终止应用程序的时间。但是,无论如何,当应用程序的进程终止时,对象都会被释放。因此Object.finalize()没有被调用,因为它不需要被调用。开发人员为什么要关心? 每次我使用必须手动关闭的对象(例如文件句柄和连接)时,我都会感到非常沮丧。我必须不断检查对象是否具有的实现close(),并且我肯定在过去的某些时候错过了对它的一些调用。为什么不把它放到VM和GC中,而是通过将close()实现放入其中来处置这些对象,这将变得更加简单,安全Object.finalize()呢?

3
Java开发是否通常比C#/。NET涉及更多的子类化?
我最近开始研究Android开发。这使我回到了Java软件开发领域。我承认,上一次我使用Java时,我对OOP的了解不如现在(我认为)那么多。 在我的职业生涯中主要使用C#之后,我注意到Java和C#在继承使用方式方面的惊人差异。 在C#中,似乎在大多数情况下都可以避免继承。通常,可以通过使用.NET框架的具体类来完成当前的任务。 在Java中,从我从代码示例中收集的信息来看,Java框架似乎提供了许多接口或抽象类,这些接口或抽象类将由开发人员实现/扩展。 这似乎太大了,不能简单地归结为风格。这背后的原因是什么?我觉得直到我理解这一点,我才会写干净的Java代码。 此外,这是否仅限于Android SDK还是Java范围内的OOP方法? 或换种说法, 这两种语言(似乎鼓励)比另一种或多或少使用继承的设计是什么? 如果语言对继承的处理相同,并且假设我的观察是有效的,则意味着这与框架/库的设计有关,而与语言无关。这种设计的动机是什么?

2
如何改进Bloch的Builder模式,使其更适合在高度可扩展的类中使用
Joshua Bloch的《 Effective Java》(第二版)对我的影响很大,可能比我所读过的任何编程书都影响更大。特别是他的“建造者模式”(项目2)产生了最大的影响。 尽管Bloch的构建者在几个月内使我比过去十年更深入,但我仍然发现自己碰壁:使用自返回方法链扩展类充其量是令人沮丧的,更糟的是噩梦--especially当仿制药开始发挥作用,并特别与自我参照仿制药(如Comparable<T extends Comparable<T>>)。 我有两个主要需求,在这个问题中,我只想关注其中的第二个需求: 第一个问题是“如何共享自返回方法链,而不必在每个...单个...类中重新实现它们?” 对于那些可能感到好奇的人,我已经在本答案的底部讨论了这一部分,但这不是我想在这里重点讨论的。 我要评论的第二个问题是“如何在自己打算由许多其他类扩展的类中实现构建器?” 与构建者一起扩展课程比没有构建者扩展难度更大。扩展具有构建器的类也很麻烦,Needable因此也具有重要的泛型。 所以这是我的问题:我如何改进(称为)Bloch Builder,这样我就可以随意将构建器附加到任何类上,即使该类是可能成为“基础类”的,扩展和扩展了许多次- 在不影响我的未来自我或我的图书馆用户的情况下,由于构建器(及其潜在的泛型)施加了额外的负担吗? 附录 我的问题集中在上面的第2部分,但是我想详细说明问题一,包括如何处理它: 第一个问题是“如何共享自返回方法链,而不必在每个...单个...类中重新实现它们?” 这并不是要防止扩展类不得不重新实现这些链,当然,它们必须-而是如何防止希望利用这些方法链的非子类重新实现。 -实现每个自返回功能,以便他们的用户能够利用它们?为此,我提出了一个需要需求的设计,我将在此处打印界面框架,并暂时保留该框架。它对我来说效果很好(此设计需要花费数年的时间……最难的部分是避免循环依赖): public interface Chainable { Chainable chainID(boolean b_setStatic, Object o_id); Object getChainID(); Object getStaticChainID(); } public interface Needable<O,R extends Needer> extends Chainable { boolean isAvailableToNeeder(); Needable<O,R> startConfigReturnNeedable(R n_eeder); R getActiveNeeder(); boolean …

11
Java与C#-生产率透视图
如果您有使用Java的多年经验,以及使用C#和.NET的多年经验,那么我对您在这两种环境之间的软件开发生产力差异方面的观点表示赞赏。我们的一位客户正在考虑更换其现有的软件解决方案。由于更换将需要大约。根据Java或.NET之间的生产率差异,选择10到15个工作年的工作可能会显着影响所需的投资和上市时间。 您能否向我们提供Java和C#/。NET之间软件开发生产率差异的指示?我希望收到如下答复: 我的经验是基于X的Java工作经验和X的C#/。NET工作经验。如果考虑以下因素,则Java的生产力比Java#高出X%,而C#.NET或C#/。NET的生产力比Java高出X%。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.