Questions tagged «java»

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

1
为什么Null-Safe运算符(例如“ Elvis运算符”)被Java 7的“项目代币”拒绝?
Java 7的“项目硬币”的建议功能之一是“猫王运算符”。一个2009年的JavaOne大会上演示的报告对项目硬币将其形容为这样的: 本演示文稿介绍的“小功能”之一是所谓的“猫王运算符”,这是三元运算符的更简洁版本。我发现自己在使用传统Java时缺少了Groovy的某些功能,如果添加了它,这将是我可以同时使用两种语言的一种运算符。“ Elvis”运算符可方便地指定默认值,该默认值可在评估表达式为null时使用。像Groovy的安全导航运算符一样,这​​是一种指定如何避免不必要的null的简洁方法。我以前在博客中写过关于如何避免NullPointerException的博文。 尽管最终实现了Project Coin的其他方面,但这一方面并未实现。尽管猫王运算符在JavaOne上被提出可能被纳入,但为什么最终还是被拒绝了? 明确地说,我要特别询问该运算符,以及它被拒绝作为Java 7“ Project Coin”的一部分的原因,因为当时已对其进行了认真考虑。我怀疑在讨论了拒绝邮件的原因的邮件列表或此类邮件列表,但找不到任何东西。如果有更多关于为什么它不包含在Java的任何版本中的一般信息,则可以接受,但不是首选。
10 java  api-design 

5
违反LSP可以吗?
我正在跟进这个问题,但是我将重点从代码转换为原则。 根据我对Liskov替换原理(LSP)的理解,无论我的基类中有什么方法,它们都必须在我的子类中实现,并且根据此页面,如果您在基类中重写了一个方法,则它什么也不做或抛出一个错误。例外,您违反了该原则。 现在,我的问题可以这样总结:我有一个abstract Weapon class,两个类,Sword和Reloadable。如果Reloadable包含一个特定的method,称为Reload(),我将不得不向下访问以访问该method,并且理想情况下,您希望避免这种情况。 然后,我想到了使用Strategy Pattern。这样,每把武器都只知道它能够执行的动作,因此,例如,一种Reloadable武器显然可以重新装弹,但是Sword不能,甚至不知道Reload class/method。正如我在Stack Overflow帖子中所说的那样,我不必沮丧,也可以维护List<Weapon>收藏集。 在另一个论坛上,第一个答案建议让其Sword意识到Reload,只是什么也不要做。我在上面链接到的“堆栈溢出”页面上也给出了相同的答案。 我不完全明白为什么。为什么要违反该原则并让Sword知道Reload并保留为空?正如我在Stack Overflow帖子中所说,SP几乎解决了我的问题。 为什么它不是可行的解决方案? public final Weapon{ private final String name; private final int damage; private final List<AttackStrategy> validactions; private final List<Actions> standardActions; private Weapon(String name, int damage, List<AttackStrategy> standardActions, List<Actions> attacks) { this.name = name; this.damage = damage; standardActions = …

1
避免依赖版本冲突?
几乎可以肯定,使用我的jar的任何Java项目都将对另一个jar附加依赖,我的jar也将其作为依赖项。 问题是,其他jar有多个版本。 在您项目的第二个jar版本与第二个jar版本不同的情况下,如何避免出现任何问题? 我不希望我的用户有多余的麻烦来做一些花哨的类加载技巧来添加我的jar。 我是否应该为该通用依赖项的每个可能版本制作一堆不同版本的jar?然后,您只需选择使用与您刚碰到的第二个jar版本相同的jar版本即可? 有没有更聪明的方式来处理此问题,并使人们更轻松地使用我的jar,而不会发生冲突?

1
是否存在使用弱引用而不是简单组合更好的情况?
虽然Java文档指定,即弱引用主要用于映射进行规范化,你会发现很多,很多,很多人在互联网上声称,该WeakHashMap中是完美的在其一生中存储的对象元数据。但是,没有人愿意做一个易于理解和适当的例子。 使用WeakHashMap向对象添加一些属性或存储元数据的声音对我来说,就像一个基于将要使用该死的东西的意愿的任意决定。换句话说-一个不好的设计。我了解,在某些情况下继承可能不可用(最终类,接口),但是组合又如何呢?我想不出一个例子,其中组合不是一种选择。当然,这是一个更好的选择,因为它依赖于公认的原则,而不是“语言怪癖”。 那么,有没有一种情况,使用弱引用而不是简单的组合会更好?如果没有,为什么互联网上的每个人似乎都会出错?

2
避免获取和设置方法,显示用户信息
背景 我正在阅读“清洁代码手册”,并且在并行中,我正在像银行账户那样从事诸如体操之类的身体对象卡塔(Kata)的研究: 健美操对象的第9条规则是我们不要使用吸气剂或吸气剂。 看起来很有趣,我同意这一原则。而且,在“清洁代码”的第98-99页,作者解释说,getters / setters破坏了抽象,并且我们不必询问对象,而必须告诉对象。 在我看来,这是完全合理的,我完全同意这一原则。问题出在实践中。 语境 例如,我有一个必须列出一些用户并显示用户详细信息的应用程序。 我的用户包括: -> Name --> Firstname --> String --> Lastname --> String -> PostalAddress --> Street --> String --> PostalCode --> String 问题 当我只需要显示一个简单的信息(并且我必须确认我不需要对该特定字段进行额外的操作)时,我该怎么办?或者如何避免吸气剂以简单的方式显示Firstname值(随机)输出支持? 我想到什么 一种解决方案是: user.getName().getFirstName().getStringValue() 这非常可怕,违反了许多健美操规则,并违反了Demeter法则。 另一个可能是这样的: String firstName = user.provideFirstnameForOutput(); // That would have called in the user object …

7
为什么圈复杂度对于单一方法如此重要?
从最近开始,我就在SonarLint for Eclipse中使用它,这对我有很大帮助。但是,它向我提出了关于圈复杂度的问题。 SonarLint认为可接受的CC为10,在某些情况下我超出了CC,大约为5或6个单位。这些部分与映射器相关,其中值依赖于不同的变量,例如: 字段A依赖于字符串sA; 字段B依赖于String sB; 字段C依赖于String sC; 等... 我别无选择,只能if为每个领域放一个。(幸运的是)这不是我的选择,而是我自己无法更改的已经存在的复杂系统。 我的问题的核心是:为什么单一方法中 CC不能过高如此重要?如果您将某些条件转移到一个或多个子方法中以降低复杂性,那么它并不能降低整体功能的成本,只是将问题转移到其他地方,我猜? (对不起的小错误,如有)。 编辑 我的问题不涉及全局圈复杂性,而仅涉及单个方法的复杂性和方法的拆分(抱歉,我很难解释我的意思)。我在问为什么如果仍然属于“超级方法”,为什么可以将您的条件拆分为较小的方法,而超级方法只能执行每个子方法,从而增加了算法的复杂性。 但是,第二个链接(关于反模式)很有帮助。

4
面向对象编程中的主要职责是什么?
我是面向对象编程的新手,但我不明白主对象的目的是什么。 是的,我读到它是程序的“入口点”,但是我不明白的是程序的主要内容是什么?它的职责是什么? 可能会发生将主体编写的内容封装到另一个对象中的情况,但是您应该使用这种方法多少呢? 这是我用Java编写的第一个主语言,它很简单,但是可能会让您更好地理解我的疑问。我有一个抽象类Animal,它由“ Cat”和“ Dog”扩展。我使用main来创建一些对象,并使用它作为与用户的“接口”,确实如您所见,我使用了一些条件指令来“询问用户”他想做什么。 我的问题来自于这样一个事实,即接口可以封装在另一个对象中,而不是把责任交给主要对象。 public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.println("What type of animal do you want to create? \n dog cat"); String type = input.nextLine(); if ( Objects.equals(type, "dog")){ System.out.println("Enter the animal's age: "); int age = input.nextInt(); // Scans the …


5
您是否应该尽量减少创建许多小对象?
在编写经常创建许多(1000个)小对象的东西时,您是否应尝试将其最小化以提高性能?特别是如果您不知道它将在低端台式机到高端台式机甚至是移动设备上运行的系统。对于移动设备,我听说创建很多对象会严重影响性能,尽管我不知道那是多么真实。 我有一个例子很好地说明了这个想法。例如,在图形程序中,存在一种理想地用于所有绘图的方法drawPixel(Point)。可能会创建1000点,并且可能会经常重复,例如在游戏中每秒可能会被调用60次以上。或者,drawPixel(int x, int y)可用于最小化许多Point对象的创建。 在面向对象的设计中,我认为首选使用Point。但是,使用基本类型可以提高性能。在大多数情况下,性能提升可以忽略不计,但是我不确定移动设备或旧机器之类的东西。这样做会提高性能,应该考虑吗?

2
为什么在Oracle Java教程中将检查与未检查的异常称为“争议”?
我是Java新手,正在阅读有关异常的文档。,尤其是“ 未经检查的异常”-“争议”页面。 底线是: 如果可以合理预期客户端会从异常中恢复,请将其设置为已检查的异常。如果客户端无法采取任何措施来从异常中恢复,请将其设置为未经检查的异常。 我不明白这篇文章。什么是“争议”?你能用简单的话来解释吗?

4
什么时候在Java中使用null语句?
在我一直在寻找一个类的教科书中,有人说,一个语句可以为空(null语句)。null语句仅定义为分号。 它在执行时绝对不执行任何操作。null语句很少使用。 作为一个经验丰富的程序员,我发现有趣的是,他们说很少使用,这暗示着某个地方有用途。 这样的声明可能有什么用?
10 java 

5
使用编译时值参数生成Java类
考虑一个类实现相同的基本行为,方法等的情况,但是该类可能存在多种不同版本以用于不同用途。在我的特定情况下,我有一个向量(一个几何向量,而不是一个列表),并且该向量可以应用于任何N维欧几里德空间(1维,2维等)。如何定义此类/类型? 在C ++中,这很容易,因为C ++中的类模板可以将实际值作为参数,但是在Java中我们没有那么奢侈。 我可以想到的解决该问题的两种方法是: 在编译时实现每种可能的情况。 public interface Vector { public double magnitude(); } public class Vector1 implements Vector { public final double x; public Vector1(double x) { this.x = x; } @Override public double magnitude() { return x; } public double getX() { return x; } } public class …

2
为什么我们需要Scanner类的实例才能在Java上获得输入?
Java是面向对象的,但是,为什么我们需要从Scanner类创建一个对象来获取输入?next()例如,方法不能只是静态的吗? C相我很简单,因为你只需要使用scanf(),gets()或fgets()。我确定Java开发人员有理由创建Scanner类,但是这比仅具有正常功能来完成工作更好吗? 我发现此链接似乎在问相同的问题,但答案仅与 “您需要创建一个对象,因为它不是静态的” ... 我的猜测是:由于Java是面向对象的,因此他们决定将所有输入方法放在一个类中。他们没有执行静态方法,因此您可以在不同的对象中拥有各种不同的源(键盘输入,文件输入...)? 如果有人可以编辑问题以使其听起来更加清晰,我将不胜感激!

1
Guice中@ImplementedBy批注背后的动机是什么?
我最近阅读了有关Google Guice中@ImplementedBy可用的注释的信息。它允许程序员指定接口与其实现之间的绑定,以供将来在依赖关系注入中使用。这是即时绑定的示例。 我已经习惯于使用以下语法在模块中定义显式绑定: bind(SomeInterface.class).to(SomeInterfaceImplementation.class); 根据文档,这等效于@ImplementedBy注释的以下用法: @ImplementedBy(SomeInterfaceImplementation.class) public interface SomeInterface { //method declarations } 我在这里看到的唯一好处是代码短了一点。同时,这种方法也有一个缺点,由相同的文档正确指出: @ImplementedBy小心使用;它从接口到其实现添加了编译时依赖性。 在许多情况下,这种依赖关系可能不是问题,但我个人认为这是代码的味道。 什么用例使@ImplementedBy注释值得使用? 一种可能的方法似乎是在库或框架的代码中使用它。如文档中所述,注释可以提供默认绑定,很容易被显式绑定覆盖。 如果一个类型同时在一个bind()语句(作为第一个参数)中并且具有@ImplementedBy注释,bind()则使用该语句。批注建议可使用绑定覆盖的默认实现。 这样,作为库的开发人员,我可以为用户提供现成的绑定,可以在客户端代码中的某个位置进行自定义。 这是注释存在的唯一原因吗?还是我想念的东西?我可以通过在只使用某些业务逻辑的应用程序而不是要扩展的库/框架的代码中使用它来获得任何收益吗?

2
JVM如何处理main方法抛出的异常?
我了解异常,将其抛出,处理它们,并将其传播到调用堆栈中较低的方法(即throws)。 我不明白的是: public static void main(String[] args) throws Exception { ... } 现在,我假设在main抛出的情况下,ExceptionJVM将对其进行处理(对吗?)。如果是这样,那么我的问题是: JVM如何处理引发的异常main?它有什么作用?
10 java  exceptions  jvm 

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.