首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一个类在Java中“使用”另一个类?实现“使用-a”类

一个类在Java中“使用”另一个类?实现“使用-a”类
EN

Stack Overflow用户
提问于 2016-06-10 20:22:45
回答 1查看 3.1K关注 0票数 0

我们如何在另一个类(类-2)中“使用”一个类(类-1),因为类-1只包含属性和相应的get函数和集合函数,而且Class-2具有所有操作函数(以前属于类-1)并使用Class-1属性?

最后的目标是创建一个独立的类--1--在一个单独的文件中--只有属性、setter和getter,还有一个类--2--在一个不同的文件中--它包含了Class-1的所有方法。假设Class 2导入类1,并且只在mainor调用函数中创建Class-2对象。

一种方法是在Class-2中声明类-1的对象,然后使用该对象的属性和get-set函数,但正如我在https://www.artima.com/objectsandjava/webuscript/ClassesObjects1.html中所读到的,该方法是“具有”类,而不是“使用”类。

那么如何实现“use”类呢?请参考https://www.artima.com/objectsandjava/webuscript/ClassesObjects1.html以获得更多的清晰度。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-10 22:13:11

我们如何在另一个类(类-2)中“使用”一个类(类-1),因为类-1只包含属性和相应的get函数和集合函数,而且Class-2具有所有操作函数(以前属于类-1)并使用Class-1属性?

如果类-2没有任何类-1,那么它可以在任何给定的点上使用一个类的唯一方法是,如果它创建一个类,或者它有一个提供给它。然而,它可以获得一个实例,它可以查询和操作该实例的状态,并且可以将该实例传递给其他对象。其他用途是不可能的,因为这是任何人对Class-1实例所能做的全部工作。

当您说“只在mainor调用函数中创建了Class-2对象”时,我将您解释为任何调用Class-2方法的人都不会提供任何Class-1实例。特别是,我假设您不是在直接创建Class-1实例的用户和间接获得类-2实例的用户之间画一条假想的线。这种区分是毫无意义的。如果Class-2代表它的用户创建了Class-1的实例并提供给它的用户,那么用户已经有效地创建了它们。如果用户可以以任何方式获得Class-1实例,那么在问题的抽象级别上,这些方法的细节是无关的。

这只留下了这样的可能性:类2“使用”它根据需要自行创建的第1类实例,它仅通过局部变量和/或方法参数引用(因为它“没有”任何类-1),并且不允许向其用户公开。这当然是可能的,但它的效用有限。如果设计有效,那么类-1可以完全删除,代之以类-2的局部变量和方法参数。然而,考虑到最初的单级设计确实存在状态,这样的设计似乎不太可能奏效。不过,这是有可能的。

还请注意,如果Class-2没有特定的类-1实例,那么它只能使用特定的类-1实例的唯一方法是,如果使用仅限于某个只能在类-2实例生存期内发生一次的事件,比如初始化。否则,这不是一种“使用”关系,而是一种使用关系。

由于最初的设计既有状态又有行为,状态部分似乎不太可能被简单地取消。在这种情况下,类-2用户不创建任何Class-1实例的约束似乎是错误的。您也许可以通过创建另一个类来维持与Class-1相同的状态,但这是荒谬的。既然已经有了一个非常好的类,为什么还要创建一个新类呢?如果您只是想避免Class-1被类-2以外的类直接实例化,那么允许Class-2向它的用户提供类-1的实例。因为用户随后可以获得实例,所以它可以将它们作为方法参数反馈给Class-2。这允许类-2使用类-1而不具有任何类-1本身.例如,

代码语言:javascript
复制
public class State {
    private int x;

    State(int x) {  // package-private
        this.x = x;
    }

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }
}

public class Behavior {
    // Uses State, but is not a State and does not have a State

    public State doSomethingThatYieldsState(String s) {
        try {
            return new State(Integer.parseInt(s));
        } catch (NumberFormatException nfe) {
            return null;
        }
    }

    public int doSomethingWithState(State s, int y) {
        return y + s.getX();
    }

    public void doSomethingToState(State s) {
        s.setX(s.getX() + 1);
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37756635

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档