Questions tagged «java»

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

13
我们是否应该避免C ++具有但Java没有的语言功能?
假设我只能在项目环境中使用C ++。防止使用C ++拥有但Java没有的某些语言功能是否很好(例如:多重继承,运算符重载)? 我认为原因是: 由于Java比C ++更新,因此如果Java没有提供C ++具有的功能,则意味着该功能不好,因此我们应避免使用它。 具有C ++特定功能(例如:朋友功能,多重继承)的C ++代码只能由C ++程序员维护或检查,但是如果我们只编写Java之类的C ++(没有C ++语言特定的功能),则两者都可以维护或检查代码。 C ++和Java程序员。 有一天可能会要求您将代码转换为Java 没有C ++特定功能的代码通常更易于维护 每个C ++语言特定的功能(例如:多重继承)都应具有在Java中实现的替代方法。如果不是这样,则意味着设计模式或代码体系结构存在问题。 真的吗?
110 java  c++  code-quality 

12
是否比实例变量更喜欢局部变量?
我正在使用的代码库经常使用实例变量在各种简单方法之间共享数据。最初的开发人员坚持认为这要遵循Bob / Robert Martin叔叔在Clean Code书中所述的最佳实践:“功能的第一个规则是它们应该很小。” 和“函数的理想参数个数为零(尼拉度)。(...)参数很难。它们需要很大的概念力。” 一个例子: public class SomeBusinessProcess { @Inject private Router router; @Inject private ServiceClient serviceClient; @Inject private CryptoService cryptoService; private byte[] encodedData; private EncryptionInfo encryptionInfo; private EncryptedObject payloadOfResponse; private URI destinationURI; public EncryptedResponse process(EncryptedRequest encryptedRequest) { checkNotNull(encryptedRequest); getEncodedData(encryptedRequest); getEncryptionInfo(); getDestinationURI(); passRequestToServiceClient(); return cryptoService.encryptResponse(payloadOfResponse); } private void …
109 java  refactoring 

5
在Java中,即使不必使用“ final”作为参数和局部变量也应如此吗?
Java允许将变量(字段/局部变量/参数)标记为final,以防止重新分配到变量中。我发现它对于字段非常有用,因为它可以帮助我快速查看某些属性(或整个类)是否是不可变的。 另一方面,我发现它对局部变量和参数的用处不大,通常我避免将它们标记为final即使它们永远都不会被重新分配(明显的例外,当它们需要在内部类中使用时) 。但是,最近,我遇到了最终可用的代码,我想从技术上讲,它可以提供更多信息。 不再对我的编程风格充满信心,我想知道在final任何地方应用的其他优点和缺点是什么,最常见的行业风格是什么,为什么。
105 java  coding-style  final 

5
当我们已经有了抽象类时,为什么要将默认方法和静态方法添加到Java 8的接口中?
在Java 8中,接口可以包含已实现的方法,静态方法和所谓的“默认”方法(实现类不需要重写)。 以我的观点(可能是幼稚的),不需要违反这样的接口。接口一直是您必须履行的合同,这是一个非常简单而纯粹的概念。现在,它是几件事情的混合体。在我看来: 静态方法不属于接口。它们属于实用程序类。 根本不应该在接口中允许使用“默认”方法。为此,您可以始终使用抽象类。 简而言之: 在Java 8之前: 您可以使用抽象和常规类来提供静态和默认方法。接口的作用很明显。 接口中的所有方法都应通过实现类来覆盖。 您不能在不修改所有实现的情况下在接口中添加新方法,但这实际上是一件好事。 在Java 8之后: 接口和抽象类之间几乎没有区别(除了多重继承)。实际上,您可以使用接口模拟常规类。 在对实现进行编程时,程序员可能会忘记覆盖默认方法。 如果类试图实现两个或多个具有默认方法且具有相同签名的接口,则会出现编译错误。 通过向接口添加默认方法,每个实现类都会自动继承此行为。这些类中的某些类可能并未在设计时考虑到该新功能,因此可能会引起问题。例如,如果有人将新的默认方法添加default void foo()到interface Ix,则不会编译Cx实现Ix并具有具有foo相同签名的私有方法的类。 进行此类重大更改的主要原因是什么?它们会带来哪些新的好处(如果有)?

12
有人告诉我,异常仅应在例外情况下使用。我怎么知道我的案子是否特殊?
我在这里的特定情况是用户可以将字符串传递到应用程序中,应用程序将对其进行解析并将其分配给结构化对象。有时,用户可能输入了无效的内容。例如,他们的输入可能描述一个人,但他们可能说他们的年龄是“苹果”。在这种情况下,正确的行为是回滚事务并告诉用户发生了错误,他们将不得不再次尝试。可能需要报告我们在输入中发现的每个错误,而不仅仅是第一个。 在这种情况下,我认为我们应该抛出异常。他不同意,说:“例外应该是例外:应该预期用户可能会输入无效数据,所以这不是例外情况”,我真的不知道该如何辩驳,因为按照单词的定义,他似乎是正确的。 但是,据我了解,这就是为什么首先发明例外的原因。过去,您必须检查结果以查看是否发生错误。如果检查失败,可能会在您不注意的情况下发生不良情况。 无一例外,堆栈的每个级别都需要检查调用的方法的结果,如果程序员忘记检入这些级别之一,则代码可能会意外继续并保存无效数据(例如)。这种方式似乎更容易出错。 无论如何,请随时纠正我在这里所说的任何内容。我的主要问题是,如果有人说例外应该是例外,我怎么知道我的情况是否是例外?

6
Java中的堆栈和堆内存
据我了解,在Java中,堆栈内存保存了原语和方法调用,而堆内存则用于存储对象。 假设我有一堂课 class A { int a ; String b; //getters and setters } a类中的基元A将存储在哪里? 为什么堆内存根本存在?为什么我们不能将所有内容都存储在堆栈中? 当对象被垃圾回收时,与对象相关联的堆栈是否被破坏?

9
为什么很难使Java程序“本机显示”?
大多数Java应用程序看起来与C / C ++应用程序不同。Swing可能被设计为具有独特的外观,但是根据我的阅读,例如SWT试图“看起来很自然”,但没有成功。 我的问题是: 对于Java语言的开发人员来说,为什么要设计出完全复制本机GUI 外观的GUI系统很困难?本机GUI有什么不同?设计不仅仅是看起来像“本机”按钮的按钮吗?还是比这更深入?
98 java  gui 

4
Java引用与C指针有何不同?
C有指针,Java有所谓的引用。从某种意义上说,它们有共同点,即它们都指向某个事物。我知道C中的指针存储它们指向的地址。参考也存储地址吗?除了指针更灵活,更容易出错之外,它们又有何不同?
97 java  c  pointers  reference 

17
封装仍然是OOP坚持的大象之一吗?
封装告诉我将所有或几乎所有字段都设为私有,并通过getter / setter公开这些字段。但是现在出现了Lombok之类的库,这些库使我们可以用一个简短的注解公开所有私有字段@Data。它将为所有私有字段创建getter,setter和set构造函数。 有人可以向我解释将所有字段隐藏为私有,然后再通过一些额外的技术将所有字段公开的感觉是什么?为什么我们不仅仅使用公共字段呢?我觉得我们走了漫长而艰难的路,才回到起点。 是的,还有其他一些可以通过getter和setter方法工作的技术。我们不能通过简单的公共领域使用它们。但是出现这些技术仅仅是因为我们拥有众多特性-公共获取者/设置者背后的私有领域。如果我们没有这些财产,这些技术将另辟way径,并为公共领域提供支持。一切都将变得简单,我们现在不需要龙目岛了。 整个周期的整体意义是什么?在现实生活的编程中,封装真的有意义吗?

10
是否有人可以挑战鲍勃叔叔,因为他喜欢移除“无用的牙套”?
我讨厌引用付费墙内容,但是这段视频恰好显示了我在说什么。恰好在罗伯特·马丁(Robert Martin)的12分钟内看了一下: 并说“我最喜欢做的一件事情就是摆脱无用的牙套”,因为他将其变成了这样: 很久以前,在遥远的教育中,我被教导不要这样做,因为它可以通过添加另一条缩进的行以使其很容易引入错误,认为该错误是由if不受时间控制的。 为了公平起见,鲍勃叔叔(Bob)将他的Java长方法重构为微小的小函数,我同意这些小函数的可读性要高得多。当他完成更改后,(22.18)看起来像这样: 我想知道是否应该验证删除括号。我已经熟悉了最佳实践。鲍勃叔叔可以在这一点上受到挑战吗?鲍勃叔叔捍卫了这个主意吗?

5
为什么Java根本没有优化尾递归?
据我所读:原因是因为在继承时,要确定要实际调用的方法并不容易。 但是,为什么Java至少没有对静态方法进行尾递归优化并强制使用正确的方法来用编译器调用静态方法? 为什么Java根本不支持尾递归? 我不确定这里是否有任何困难。 关于建议的副本,如JörgW Mittag 1所述: 另一个问题是关于TCO的,这个是关于TRE的。TRE比TCO简单得多。 此外,另一个问题询问JVM对希望编译为JVM的语言实现施加哪些限制,该问题询问Java,这是不受JVM限制的一种语言,因为JVM规范可以通过以下方式更改:设计Java的人 最后,JVM中甚至没有关于TRE的限制,因为JVM确实具有方法内GOTO,这是TRE所需的全部 1 添加了格式以标注点。

16
年轻人需要学习指针概念吗?
为什么C大师Dennis Ritchie会在C中引入指针?以及为什么其他编程语言(例如VB.NET或Java或C#)消除了它们?我在Google中找到了一些要点,我也想听听您的评论。他们为什么要消除现代语言中的指针概念? 人们说C是基本语言,而指针是使C强大而又出众且使C仍能与更多现代语言竞争的概念。那么为什么他们要用更现代的语言消除指针呢? 您认为指针知识对于新程序员仍然重要吗?如今,人们正在使用VB.NET或Java,它们支持比C更高级的功能(并且不使用任何指针概念),而我现在看到的许多人(我的朋友)选择这些语言而忽略了C,因为它们支持高级功能。我告诉他们以C开头。他们说,当您在VB.NET或Java中进行高级的操作(在C中无法实现)时,学习指针的概念很浪费。 你怎么看? 更新时间: 我在Google上读到的评论是: 较早的计算机速度太慢且未优化。 使用指针可以直接访问地址,这样可以节省时间,而不是在函数调用中复制它。 使用指针的安全性要差得多,这就是Java和C#不包含指针的原因。 这些以及更多我发现的东西。我仍然需要一些有价值的答案。这将不胜感激。

17
对所有开发人员强加相同的代码格式是一个好主意吗?
我们正在考虑在我们的项目中采用单一标准代码格式(在Eclipse中具有保存操作的自动格式)。原因是,当前有几个(> 10)开发人员使用的代码格式存在很大差异,这使一个开发人员更难处理另一开发人员的代码。相同的Java文件有时会使用3种不同的格式。 因此,我认为优点很明显(可读性=>生产率),但是强加此方法是个好主意吗?如果没有,为什么? 更新 我们所有人都使用Eclipse,并且每个人都知道该计划。大多数人已经使用了一种代码格式,但是由于某些人倾向于坚持自己的代码格式,因此未强制执行。由于上述原因,有些人宁愿执行它。


10
您如何避免吸气剂和吸气剂?
我在以oo方式设计类时遇到了一些困难。我已经读过对象暴露了他们的行为,而不是数据。因此,给定类的方法应该是“动词”或对对象执行的操作,而不是使用getter / setter修改数据。例如,在“帐户”对象,我们将有方法Withdraw()和Deposit(),而不是setAmount()等请参见:为什么getter和setter方法是邪恶的。 因此,例如,给定一个Customer类,该类保留了大量有关客户的信息,例如Name,DOB,Tel,Address等,那么如何避免使用getter / setter来获取和设置所有这些属性?一个人可以写哪种“行为”类型的方法来填充所有数据?

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.