Tag: oop

如何使用“instanceof”实现generics的“equals”方法?

我有一个接受generics类型的类 ,我想以一种非笨拙的方式覆盖equals方法(即看起来很干净并且代码量很少的东西,但对于非常一般的用例)。 现在我有这样的事情: public class SingularNode { private T value; @SuppressWarnings(“unchecked”) @Override public boolean equals(Object other){ if(other instanceof SingularNode){ if(((SingularNode)other).value.equals(value)){ return true; } } return false; } } 我猜,这是非常有缺陷的 – 我正在对other对象的SingularNode进行强制转换,这可能会引发错误 。 另一件事是 – 当我这样做if(other instanceof SingularNode)我实际上并没有检查到正确的东西。 我实际上想检查类型T而不是类型? 。 每当我试图制作? 进入T ,我得到一些错误: 无法对参数化类型SingularNode执行instanceof检查。 请改为使用SingularNodeforms,因为在运行时将删除其他generics类型信息 我怎么能绕过这个? 有没有办法做T.class.isInstance(other); ? 我想有一个非常难看的黑客解决方案是这样的: @SuppressWarnings(“unchecked”) public boolean isEqualTo(Class c, Object obj){ […]

类的对象作为类中的实例变量

可能重复: 一个类如何拥有自己类型的成员,这不是无限递归吗? 代码: public class Test2{ private Test2 subject = new Test2(); //Create Test2 object in Test2 private int num; } 问题: 为什么Java允许执行上面的代码,但C ++不允许? 上面的代码是否创建了无限数量的对象? 由于Test2本身包含一个Test2对象,它再次包含一个Test2对象,该对象本身有一个Test2对象,依此类推。

如何遵守得墨忒耳的法律?

每当我看到关于得墨忒耳法的文章时,作者似乎都没有给出如何遵守这一法律的可靠实例。 他们都解释了它是什么,并展示违法的例子,但这很容易。 可能有很多方法可以遵守这个法律(好的设计和计划就是一个),但用非常简单的术语来说,这是一种服从它的方法吗? 假设我有一个具有这些属性的类: public class Band { private Singer singer; private Drummer drummer; private Guitarist guitarist; } 我在程序中的某个地方,我有一个Band类的实例,我想要吉他手的名字,我通常看到的是: guitaristName = band.getGuitarist().getName(); 那个似乎并不太糟糕,因为链条不会太深,但是得墨忒耳法则说它可能应该这样做: guitaristName = band.getGuitaristName(); 我的Band类有一个方法: public String getGuitaristName() { return guitarist.getName(); } 这是你应该遵守法律的吗? 谢谢。

在Java 8中使用多重inheritance

我使用 Java 8的function还是滥用它? 请参阅下面的代码和说明,了解为什么选择这样的代码。 public interface Drawable { public void compileProgram(); public Program getProgram(); default public boolean isTessellated() { return false; } default public boolean isInstanced() { return false; } default public int getInstancesCount() { return 0; } public int getDataSize(); public FloatBuffer putData(final FloatBuffer dataBuffer); public int getDataMode(); public boolean isShadowReceiver(); public boolean isShadowCaster(); […]

为什么我们在实例化它们之前首先将子类型声明为它们的超类型?

阅读其他人的代码,我见过很多: List ints = new ArrayList(); Map map = new HashMap(); 我的问题是:以这种方式实例化它们的意义/优点是什么,而不是: ArrayList ints = new ArrayList(); HashMap map = new HashMap(); 令人感到奇怪的是,我从未见过如下: CharSequence s = new String(“String”); 要么 OutputStream out = new PrintStream(OutputStream); 重复(问题的第一部分): 何时/为何使用/定义接口 在java中使用接口或类型进行变量定义? 我什么时候应该在java中使用接口? 为什么创建接口而不是每个类的实现 这两个java变量声明有什么区别?

增加1并将其与每个创建的对象一起添加?

class MyObject { static int instanceCounter = 0; static int counter = 0; MyObject() { instanceCounter++; counter = counter + 1; } } 我使用静态int来获取此输出: 对象1:5的instanceCounter的值 instanceCounter for MyObject的值:5 对象1:1的计数器值 对象2:2的计数器值 对象3:3的计数器值 对象4:4的计数器值 对象5:5的计数器值 但它的显示 对象1:5的instanceCounter的值 instanceCounter for MyObject的值:5 对象1:5的计数器值 对象2:5的计数器值 对象3:5的计数器值 对象4:5的计数器值 对象5:5的计数器值 我的跑步者class class RunMyObject { public static void main(String[] args) { MyObject Object1 […]

Builder模式与配置对象

构建器模式在创建不可变对象时很流行,但是创建构建器会产生一些编程开销。 所以我想知道为什么不简单地使用配置对象。 构建器的用法如下所示: Product p = Product.Builder.name(“Vodka”).alcohol(0.38).size(0.7).price(17.99).build(); 很明显,这是非常易读和简洁的,但您必须实现构建器: public class Product { public final String name; public final float alcohol; public final float size; public final float price; private Product(Builder builder) { this.name = builder.name; this.alcohol = builder.alcohol; this.size = builder.size; this.price = builder.price; } public static class Builder { private String name; private float […]

为什么Object类在java中是超类

为什么对象Class是java中的超类我昨天接受过一次采访,面试官问我这些问题。

OOP的学校是什么?

Smalltalk OOP和Simula OOP之间是否存在哲学差异? 这是一个间接涉及Java&C#vs C ++的问题。 据我所知,C ++基于Simula,但Java和C#或多或少来自Smalltalk系列。

为什么Java不支持像C中的clrscr这样的函数?

我有一个问题对许多人来说可能听起来很愚蠢,但我不能停下来发布它,因为互联网上没有发现任何东西。 为什么java没有我们在C中使用的clrscr类型的函数? 如果我创建了一个基于用户输入反复迭代的java concole应用程序,然后如果我想为用户提供清除屏幕的选项,那么为什么它在java中不受支持。 我知道有一些像这样的方式。 它是否与Java有关OOP(我非常怀疑,但没有具体的答案)。