实际上,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 8开始,我们可以在接口中使用默认方法和静态方法.
常量接口模式是对称为Constant Interface Antipattern的接口的不良使用.
>有效的Java,第17项:
常量接口模式是接口的不良使用.类在内部使用一些常量是一个实现细节.实现常量接口会导致此实现细节泄漏到类的导出API中.类的用户实现一个常量接口并不重要.事实上,它甚至可能使他们感到困惑.更糟糕的是,它代表了一种承诺:如果在将来的版本中修改了类以便它不再需要使用常量,它仍然必须实现接口以确保二进制兼容性.如果非最终类实现了一个常量接口,那么它的所有子类的命名空间都会受到接口中常量的污染.
java平台库中有几个常量接口,例如java.io.ObjectStreamConstants.这些接口应视为异常,不应模拟.
如果使用常量接口是一种不好的做法,那么使用接口静态方法可能会成为一种不好的做法?
关于构造函数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?
我在这次通话中收到了声纳警报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 验证。我不需要再次进行此验证。
我的病例是误报吗?
命令: git log --graph, 在输出的左侧显示带有基于文本的图形表示的提交日志。
关于--all限制提交输出的选项,git 文档说:
提交限制
除了使用描述中解释的特殊符号指定应该列出的提交范围之外,还可以应用额外的提交限制。
- 全部
假设所有 refs 在
refs/命令行中都列为<commit>.
我不太了解使用此选项获得的输出。
所有的 refs 是 refs/什么?
与提交限制相关的默认值是git log --graph 多少?
关于提交限制, 和之间有什么区别?git log --graphgit log --graph --all
如果我需要一个空列表,我可以使用
Arrays.asList()
Run Code Online (Sandbox Code Playgroud)
要么
Collections.emptyList()
Run Code Online (Sandbox Code Playgroud)
这两个电话有什么区别?我应该使用哪一个?
我正在学习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.toIntExact把long价值看作是int.
是否可以int直接在lambda表达式中获取值?
根据"设计模式:可重用的面向对象软件的元素"一书,
构建器模式将复杂对象的构造与其表示分开,以便相同的构造过程可以创建不同的表示.
通常,Builder模式通过提供逐步构建对象的方法并提供实际返回最终Object的方法来解决具有大量可选参数和不一致状态的问题.
使用构建器模式,我们将使用构建方法来生成不可变的对象.
我的问题:
我可以在生成对象的类中使用构建器模式保持setter方法,允许改变构建对象的可能性吗?
如果我去制作可变对象,我不应该使用构建器模式?
我发现一些替代方法未使用方法签名中的所有参数。
例如:
@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)
声纳说:
未使用的参数会产生误导。无论传递给此类参数的值是什么,其行为都将相同。
我的问题是:当我们重写方法时,应该使用方法签名中的所有参数吗?
当我说“使用所有参数”时,我试图说方法签名中的所有参数实际上都在方法的主体(实现)中使用。
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。
如何选择此类型?什么条件可以改变返回的类型?
我需要$ 在替换这个之前验证一个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) 我正在学习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 ×11
lambda ×2
builder ×1
collections ×1
constructor ×1
git ×1
git-log ×1
immutability ×1
interface ×1
jtextfield ×1
overriding ×1
performance ×1
sonarqube ×1
swing ×1