小编Jes*_*rce的帖子

当我们覆盖toString()方法时,我们应该总是返回对象的字符串表示?

实际上,toString方法应返回对象的String表示形式.

在一个项目中,我发现了一些覆盖toString方法的类,允许返回null.

喜欢:

@Override
public String toString() {
    .......
    return null;
}
Run Code Online (Sandbox Code Playgroud)

对我来说,这种做法违反了toString方法的主要建议,该方法应该返回对象的String表示.

Object.toString()的API文档说:

public String toString()

返回对象的字符串表示形式.通常,toString方法返回一个"文本表示"此对象的字符串.结果应该是一个简洁但信息丰富的表示,便于人们阅读.建议所有子类都重写此方法.

当我们覆盖Object的toString()方法时,你永远不应该返回null?

java overriding

11
推荐指数
2
解决办法
3446
查看次数

Java 8:当使用Interface静态方法成为一种不好的做法?

从Java 8开始,我们可以在接口中使用默认方法和静态方法.

常量接口模式是对称为Constant Interface Antipattern的接口的不良使用.

>有效的Java,第17项:

常量接口模式是接口的不良使用.类在内部使用一些常量是一个实现细节.实现常量接口会导致此实现细节泄漏到类的导出API中.类的用户实现一个常量接口并不重要.事实上,它甚至可能使他们感到困惑.更糟糕的是,它代表了一种承诺:如果在将来的版本中修改了类以便它不再需要使用常量,它仍然必须实现接口以确保二进制兼容性.如果非最终类实现了一个常量接口,那么它的所有子类的命名空间都会受到接口中常量的污染.

java平台库中有几个常量接口,例如java.io.ObjectStreamConstants.这些接口应视为异常,不应模拟.

如果使用常量接口是一种不好的做法,那么使用接口静态方法可能会成为一种不好的做法?

java interface

8
推荐指数
2
解决办法
1330
查看次数

Swing:JTextField的初始String是一个空String

关于构造函数JTextField,javadoc说:

public JTextField()

构造一个新的TextField.创建默认模型,初始字符串为空,列数设置为0.

但是,当我使用此构造方法,方法getText()JTextField返回空String,例如:

boolean b = new JTextField().getText().isEmpty();  // returns true.
Run Code Online (Sandbox Code Playgroud)

为什么返回的值getText()是空的String而不是null

java swing jtextfield isnullorempty

5
推荐指数
1
解决办法
417
查看次数

声纳对规则的误报:不应取消引用空指针

我在这次通话中收到了声纳警报minRating.getRatgCaam()

该警报与声纳规则有关:不应取消引用空指针。

前任:

AgencyRating minRating = null;
.......
if (!getRatingUtilities().isNR(minRating)) {
    return minRating.getRatgCaam(); //Sonar: Null pointers should not be dereferenced
}
Run Code Online (Sandbox Code Playgroud)

该方法isNR(minRating)是一个辅助方法,用于验证对象 minRating 是否为 null

public boolean isNR(AgencyRating rating) {
    return rating == null || isNR(rating.getRatgCaam());
}
Run Code Online (Sandbox Code Playgroud)

当我按照声纳建议添加非空验证时。声纳没问题。

if (minRating !=null  && !getRatingUtilities().isNR(minRating)) {
    return minRating.getRatgCaam(); // no more alert
}
Run Code Online (Sandbox Code Playgroud)

Sonar 无法确定辅助方法是否进行了 null 验证。我不需要再次进行此验证。

我的病例是误报吗?

java sonarqube

5
推荐指数
1
解决办法
5006
查看次数

Git:“git log --graph”和“git log --graph --all”有什么区别?

命令: git log --graph, 在输出的左侧显示带有基于文本的图形表示的提交日志。

关于--all限制提交输出的选项,git 文档说:

提交限制

除了使用描述中解释的特殊符号指定应该列出的提交范围之外,还可以应用额外的提交限制。

- 全部

假设所有 refs 在refs/命令行中都列为<commit>.

我不太了解使用此选项获得的输出。

所有的 refs 是 refs/什么?

与提交限制相关的默认值是git log --graph 多少?

关于提交限制, 之间有什么区别?git log --graphgit log --graph --all

git git-log

4
推荐指数
1
解决办法
459
查看次数

空列表:Arrays.asList()和Collections.emptyList()有什么区别?

如果我需要一个空列表,我可以使用

Arrays.asList() 
Run Code Online (Sandbox Code Playgroud)

要么

Collections.emptyList() 
Run Code Online (Sandbox Code Playgroud)

这两个电话有什么区别?我应该使用哪一个?

java

4
推荐指数
1
解决办法
5478
查看次数

在lambda表达式里面有Math.toIntExact?

我正在学习lambda表达式.给定一个名称列表,我想计算一下开头的名字数量N.

我这样做了:

final static List<String> friends = Arrays.asList("Brian", "Nate", "Neal", "Raju", "Sara", "Scott");

public static int countFriendsStartWithN() {
    return  Math.toIntExact(friends
            .stream()
            .filter(name -> name.startsWith("N"))
            .count());
}
Run Code Online (Sandbox Code Playgroud)

对count方法的调用返回一个原语,long但我想要一个int.
我曾经Math.toIntExactlong价值看作是int.

是否可以int直接在lambda表达式中获取值?

java lambda

3
推荐指数
2
解决办法
149
查看次数

是否存在使用Builder模式创建的对象不可变的约定?

根据"设计模式:可重用的面向对象软件的元素"一书,

构建器模式将复杂对象的构造与其表示分开,以便相同的构造过程可以创建不同的表示.

通常,Builder模式通过提供逐步构建对象的方法并提供实际返回最终Object的方法来解决具有大量可选参数和不一致状态的问题.

使用构建器模式,我们将使用构建方法来生成不可变的对象.

我的问题:

我可以在生成对象的类中使用构建器模式保持setter方法,允许改变构建对象的可能性吗?

如果我去制作可变对象,我不应该使用构建器模式?

java constructor design-patterns builder immutability

2
推荐指数
2
解决办法
670
查看次数

当我们重写一个方法时,我们应该使用方法签名中的所有参数吗?

我发现一些替代方法未使用方法签名中的所有参数。

例如:

@Override
protected void setSomething(Object a, Object b, Object c) {
    this.a = a
    this.b = b;
    // the parameter c is not used (ignored)
}
Run Code Online (Sandbox Code Playgroud)

通常,父类不必关心子代将如何实现抽象方法。

但是在MHO中,将使用方法的参数,当子类实现不需要参数时,这种情况非常少见,当这种情况发生时,接口的设计或抽象类可能存在问题。

一个功能的基础是:输入->输入过程->输出。

有时您需要计算这些输入,但是如果您不打算在函数的过程中使用其中的一些输入,则不应将这些输入作为函数的输入。

您可以跳过这些输入的计算,从而调用使用所有输入的精确函数,因此该精确函数。

这种情况唯一可以接受的情况是,当我们不想父类的行为时,可以这样写:

@Override
protected void setSomething(Object a, Object b, Object c) {
      //Nothing to do
}
Run Code Online (Sandbox Code Playgroud)

要么

@Override
 protected void setSomething(Object a, Object b, Object c) {
  throw new UnsupportedOperationException(...);
}
Run Code Online (Sandbox Code Playgroud)

声纳说:

未使用的参数会产生误导。无论传递给此类参数的值是什么,其行为都将相同。

我的问题是:当我们重写方法时,应该使用方法签名中的所有参数吗?

当我说“使用所有参数”时,我试图说方法签名中的所有参数实际上都在方法的主体(实现)中使用。

java

2
推荐指数
1
解决办法
2793
查看次数

如何选择Collectors.toList()返回的列表类型?

Collectors.toList()的文档说,不能保证返回的类型。

在一个简单的测试中:

Stream<String> s = Stream.of("Geeks", 
                                 "for", 
                                 "GeeksforGeeks", 
                                 "Geeks Classes"); 

List<String> myList = s.collect(Collectors.toList()); 
Run Code Online (Sandbox Code Playgroud)

的类型myList是ArrayList。

Ť

如何选择此类型?什么条件可以改变返回的类型?

java collections

1
推荐指数
1
解决办法
69
查看次数

等于验证与indexOf验证?

我需要$ 在替换这个之前验证一个String是否包含char .

我为这个提议做了两个实现.

第一个实现始终执行replace(char oldChar, char newChar)equals(Object anObject)作为验证.

String getImportLine(Class<?> clazz) {
    String importLine = toSanitizedClassName(clazz.getName());
    String importStaticLine = importLine.replace('$', '.');
    if (importLine.equals(importStaticLine)) {
        return String.format("import %s;", importLine);
     } 
    return String.format("import static %s;", importStaticLine);
}
Run Code Online (Sandbox Code Playgroud)

此实现解析字符串两次:

  • importLine.replace('$', '.')
  • importLine.equals(importStaticLine)

第二种实现indexOf(int ch)用作验证,replace(char oldChar, char newChar)在最坏的情况下.

String getImportLine(Class<?> clazz) {
    String importLine = toSanitizedClassName(clazz.getName());
    if (importLine.indexOf('$') == -1) {
        return String.format("import %s;", importLine);
    }
    importLine = importLine.replace('$', '.');
    return String.format("import static %s;", …
Run Code Online (Sandbox Code Playgroud)

java performance

0
推荐指数
1
解决办法
428
查看次数

如何从方法引用创建比较器?

我正在学习lambda表达式.我不明白如何从方法引用返回比较器.

我想按年龄排序一份人员名单.

要做到这一点,我有一个方法来找到年龄差异:

public int ageDifference(final Person other) {
    return age - other.age;
}
Run Code Online (Sandbox Code Playgroud)

sorted方法需要作为参数aComparator

Stream<T> sorted(Comparator<? super T> comparator);
Run Code Online (Sandbox Code Playgroud)

我的lambda表达式是:

people.stream()
.sorted(Person::ageDifference)
.collect(toList());
Run Code Online (Sandbox Code Playgroud)

怎么Person::ageDifference变形Comparator<Person>

我的完整例子:

public class Person {

private final String name;
private final int age;

public Person(final String theName, final int theAge) {
    name = theName;
    age = theAge;
}

public String getName() {
    return name;
}

public int getAge() {
    return age;
}

public int ageDifference(final Person other) { …
Run Code Online (Sandbox Code Playgroud)

java lambda

0
推荐指数
1
解决办法
92
查看次数