相关疑难解决方法(0)

喜欢构成而不是继承?

为什么喜欢构图而不是继承呢?每种方法都有哪些权衡取舍?什么时候应该选择继承而不是作文?

language-agnostic oop inheritance composition aggregation

1538
推荐指数
23
解决办法
29万
查看次数

java.io中使用最多的模式是什么?

最近我在求职面试时被问到这个问题,我无法回答.那么,java.io中最常用的模式是什么?它是如何使用的?常见的Java库中使用的其他模式有哪些?

java io design-patterns

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

是否有任何组合无法实现继承可以?

组成和继承.

我知道它们都是适当选择的工具,上下文在组合和继承之间进行选择时非常重要.然而,关于每个的适当背景的讨论通常有点模糊; 这让我开始考虑传统OOP的独特方面是多么明显的继承和多态.

多态性允许人们同等地指定"is-a"关系以及继承.特别是,从基类继承隐式地创建该类与其子类之间的多态关系.然而,尽管可以使用纯接口实现多态,但是继承通过同时传输实现细节使多态关系复杂化.通过这种方式,继承与纯多态性完全不同.

作为一种工具,继承通过简化在无关紧要的情况下重用实现,为程序员提供与多态(通过纯接口)不同的方式.但是,在大多数情况下,超类的实现细节与子类的要求略有冲突.这就是为什么我们有"覆盖"和"成员隐藏"的原因.在这些情况下,继承所提供的实现重用是通过在级联级别的代码中验证状态更改和执行路径的额外工作来购买的:子类的完整"扁平化"实现细节分布在多个类之间,这通常意味着多个文件,其中只有部分适用于相关的子类.在处理继承时,查看该层次结构是绝对必要的,因为如果不查看超类的代码,就无法知道哪些未覆盖的细节会对您的状态进行整理或转移您的执行.

相比之下,独占使用组合可以保证您可以看到哪些状态可以通过显式实例化对象进行修改,这些对象的方法可以自行调用.真正扁平化的实现仍然没有实现(实际上甚至不可取,因为结构化编程的好处是实现细节的封装和抽象)但是你仍然可以重用代码,你只需要在一个地方查看当代码行为不端时.

我的目标是在实践中测试这些想法,避免传统继承为基于纯接口的多态性和对象组合的组合,我想知道,

有什么对象组成和接口无法实现继承吗?

编辑

在迄今为止的回复中,ewernli认为一种技术没有技术专长,而另一种技术则没有; 后来他提到了每种技术固有的不同模式和设计方法.这是有道理的.但是,这个建议让我通过询问是否专用组合和界面代替传统继承来禁止使用任何主要设计模式来改进我的问题?如果是这样,在我的情况下是不是有相同的模式?

oop polymorphism inheritance composition

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

"是一个"vs"有一个":哪一个更好?

投资组合A→基金1

投资组合A→基金2

投资组合A→基金3

如果不使用is/has,我无法构建句子.但在1和2之间,

1)有一个:

class PortfolioA
{
    List<Fund> obj;
}
Run Code Online (Sandbox Code Playgroud)

2)是:

class PortfolioA : List<Fund>
{

}
Run Code Online (Sandbox Code Playgroud)

从可扩展性,可用性的角度来看,您认为哪一个更好?我仍然可以通过任何方式访问我的资金,尽管有一个小的语法变化.

oop inheritance composition

8
推荐指数
3
解决办法
8865
查看次数

包含未在 List 或 Set 中找到部分字符串

我目前有一个包含三个字符串 ( "car", "two dollar", "foo")的 Set 。然后我对通过的HashMap<String, Double>.

if (getSet().contains(currentHashMapItem.getKey()) == true) {
    System.out.println(currentHashMapItem.getKey());
}
Run Code Online (Sandbox Code Playgroud)

第一个键是"car",按预期匹配并显示。但是,第二个键是"dollar",但不显示。现在我对 contains 如何工作的理解是,如果它正在比较的字符串存在于 中返回的 Set 中,它将返回 true getSet(),但没有骰子。甚至尝试了一个ArrayList<String>也没有运气。以前有人遇到过这个吗?我是否试图切得太尖,并被迫使用正则表达式或迭代器循环?

java collections contains

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

如何在将JSON解析为映射时忽略特定字段

我想将下面的JSON解析为POJO.我用杰克逊来解析json.

{
  "totalSize": 4,
  "done": true,
  "records": [
    {
      "attributes": {
        "type": "oppor",
        "url": "/service/oppor/456"
      },
      "AccountId": "123",
      "Id": "456",
      "ProposalID": "103"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

在上面的JSON中,字段"totalSize","done","records"和"attributes"是已知字段.鉴于"AccountId","Id"和"ProposalID"是未知字段.在上面的JSON中,我不需要"属性"成为我的bean对象的一部分.

这里是我的JSON的等效bean类

public class Result {
    private int totalSize;
    private boolean done;
    private List<Map<String, String>> records;

    public int getTotalSize() {
        return totalSize;
    }

    public void setTotalSize(int totalSize) {
        this.totalSize = totalSize;
    }

    public boolean isDone() {
        return done;
    }

    public void setDone(boolean done) {
        this.done = done;
    }

    public List<Map<String,String>> getRecords() {
        return records;
    } …
Run Code Online (Sandbox Code Playgroud)

java json jackson

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

为超类指定一个引用java

我有一个带有构造函数的Vector类

Vector(int dimension) // creates a vector of size dimension
Run Code Online (Sandbox Code Playgroud)

我有一个类Neuron,它扩展了Vector类

public class Neuron extends Vector {

    public Neuron(int dimension, ... other parameters in here ...) { 
         super(dimension);
         // other assignments below here ...
     }    
}
Run Code Online (Sandbox Code Playgroud)

我希望能够做的是在Neuron类中为Vector指定另一个Vector的引用.有点像

    public Neuron(Vector v, ... other parameters in here ...) { 
         super = v;
         // other assignments below here ...
     }    
Run Code Online (Sandbox Code Playgroud)

当然,我不能这样做.有一些工作吗?即使我无法在Neuron类的构造函数中执行此操作,也许可以.

java inheritance reference superclass

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

c#继承多个父母

   namespace NUnitTestAbstract
{
    public abstract class BaseTestClass1
    {
        public abstract void BaseTestClass1Method();
    }

    public abstract class BaseTestClass2 : BaseTestClass1
    {
        // not overriding BaseTestClass1Method, child classes should do
        public void SomeTestMethodA() { }

        public void SomeTestMethodB() { }
    }

    public abstract class BaseTestClass3 : BaseTestClass1
    {
        // not overriding BaseTestClass1Method, child classes should do
        public void SomeTestMethodX() { }

        public void SomeTestMethodY() { }
    }

    public class TestClass2A : BaseTestClass2
    {
        public override void BaseTestClass1Method()
        {
            // do stuff
        } …
Run Code Online (Sandbox Code Playgroud)

c# inheritance multiple-inheritance

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

JFrame永远不会被垃圾收集

我有一个需要打开多个JFrame的应用程序(它是一个日志查看器,有时您需要在单独的窗口中查看一堆日志来进行比较).

似乎JVM(OS X上的Java 8更新101)持有对JFrame的强引用,这阻止了它被垃圾收集,并最终导致抛出OutOfMemoryError.

若要查看该问题,请运行此问题,最大堆大小为200 MB.每次打开一个窗口时,它都会消耗50兆字节的RAM.打开三个窗口(使用150兆字节的RAM).然后关闭三个窗口(调用dispose),这将释放内存.然后尝试打开第四个窗口.抛出OutOfMemoryError,第四个窗口无法打开.

我已经看到了其他答案,说明在必要时会自动释放内存以避免耗尽,但这似乎并没有发生.

package com.prosc.swing;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.NumberFormat;

public class WindowLeakTest {
    public static void main(String[] args) {
        EventQueue.invokeLater( new Runnable() {
            public void run() {
                JFrame launcherWindow = new JFrame( "Launcher window" );
                JButton launcherButton = new JButton( "Open new JFrame" );
                launcherButton.addActionListener( new ActionListener() {
                    public void actionPerformed( ActionEvent e ) {
                        JFrame subFrame = new JFrame( "Sub frame" ) {
                            private byte[] bigMemoryChunk = new byte[ …
Run Code Online (Sandbox Code Playgroud)

java swing java-memory-leaks

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

java中的继承(IS-A)与组合(HAS-A)关系

继承 (IS-A) 与组合 (HAS-A) 关系

请有人解释一下java中的继承(IS-A&HAS)关系是什么

java

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