相关疑难解决方法(0)

'朋友'相当于Java?

这里有点建筑麻烦.

在C++中,我们有"朋友"的概念,这样的朋友类可以访问私人成员.

所以,我正在开发一个Java应用程序,并试图坚持MVC架构.我有一个控制器类来管理'map_objects'之间的图形连接.我想通过使用这个控制器类隐藏DTO'map_objects'中的函数,该函数实际设置这些连接.

(即,即使控制器类实现了设置连接性所需的功能,'用户'仍然可以直接访问DTO中的setter/getter函数来自行设置它们.)

在这方面有任何设计模式或提示吗?(或者我完全搞砸了?)

DUPLICATE 有没有办法在Java中模拟C++的"朋友"概念?

java design-patterns friend

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

为什么Java中缺少friend指令?

我想知道为什么Java的设计没有friendC++中提供的指令,以便更好地控制哪些方法和实例变量可以从已定义类的包外部获得.

我没有看到任何实际的原因或任何特定的缺点,它似乎只是一个设计问题,但如果添加到语言中则不会产生任何问题.

java oop friend-class

17
推荐指数
3
解决办法
4147
查看次数

如何防止从特定类调用公共方法

我有一个现有的类,我想添加一个方法.但我希望只从特定类的特定方法调用该方法.有什么方法可以阻止来自其他类/方法的调用吗?

例如,我有一个现有的A类

public final class A
{
    //other stuff available for all classes/methods

    //I want to add a method that does its job only if called from a specific method of a class, for example:

    public void method()
    {
        //proceed if called from Class B.anotherMethod() else throw Exception
    }
}
Run Code Online (Sandbox Code Playgroud)

这样做的一种方法是获取StackTrace内部method()然后确认父方法?

我正在寻找的解决方案是更清洁和可取的解决方案,如模式或其他东西.

java class public

15
推荐指数
4
解决办法
7796
查看次数

如何将Java API的内部结构隐藏到世界其他地方

我正在开发一个Java Api来做事情(秘密,呃嗯;).

有没有办法隐藏类,以及我的API的内部结构?

我到现在才发现:

  • 使用内部类(丑陋的方式,我不想把所有内容放在类文件中)
  • 一个包中的所有类,以便我可以使用"包"-visibilty(也很难看,我需要更多的包)

例:

---
package net.my.app;
//this is the Public Access
class MyPublicClass{
    public void somePublicFunction(){ 
        //access to not visibil classes
    }
}

---
package net.my.app.notvisible:
//this is what i want to hide
class MyNOTPublicClass{
    ...
}
---
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?谢谢!

java api design-patterns

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

Java:将公共类方法暴露给同一项目的所有包,但为其他项目设置私有

我有一个包含两个软件包的库项目,分别是package1和package2,分别是class1和class2.class1有一些公共方法暴露给最终用户.我想在class1中添加一些只有class2才能访问的实用方法.我搜索了很多,但我找不到任何访问修饰符的方法只授予相同项目的不同包的访问权限.

有机会以任何方式实现它吗?

更新(代码示例):

package1中的Class1:

package com.example.package1;

public class Class1 {

    // This method should only be accessed by Class2, cannot made it public for
    // every class
    void performUtilityOperation() {
        // internal utility
    }

    // other public methods...
}
Run Code Online (Sandbox Code Playgroud)

package2中的class2:

package com.example.package2;

import com.example.package1.*;

public class Class2 {

    Class1 class1;

    public void setClass1(Class1 class1) {
        this.class1 = class1;
    }

    public void doSomeOperation() {
        this.class1.performUtilityOperation(); // here this method is not
                                                // accessible if not public
        // do some other operations …
Run Code Online (Sandbox Code Playgroud)

java oop design-patterns access-modifiers

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

隐藏jar文件中的类

是否真的不可能在jar文件中隐藏某些类?

我希望不允许直接实例化类以使其更灵活.这个罐子里只能看到工厂(或立面).

除了创建两个项目之外,还有其他办法解决这个问题吗?(两个项目:第一个包含类(实现),另一个引用第一个并包含工厂;后面只引用第二个)

java information-hiding jar facade factory-pattern

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

我的内部API类应该都在一个包中吗?

我正在努力打包API以供公众使用.因此,我试图限制只暴露于我希望公开和可支持的方法.当然,在这下面有许多有限的访问方法.

麻烦的是我有很多内部代码需要访问这些受限制的方法而不公开这些方法.这会产生两个问题:

  • 我不能创建接口来在类之间进行通信,因为这会使我的内部方法公开.
  • 除非我将大部分内部类放在同一个包中,否则我无法访问受保护的或默认的方法.

所以,我有大约70或80个内部类在干净隔离的包中但是具有过度宽松的访问修饰符.你会说单个包是两个邪恶中的较小者还是有更好的方法来掩盖我的内部方法,同时保持更细粒度的包?

我有兴趣在这里找到最好的做法.

我已经意识到了这一点

java api

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

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

C++ - 就像Java中的友元类机制一样

你知道我怎样才能让一个对象只在一个特殊的类中变化?在这个例子中,我希望对象PrivateObject在类中只能变换(可递增)Box,而不是其他地方.有没有办法实现这个目标?

public class Box { 

    private PrivateObject prv;

    public void setPrivateObject(PrivateObject p){
        prv = p;
    }

    public void changeValue(){
        prv.increment();

    }

}


public class PrivateObject {
    private value;
    public increment(){
        value++;
    }

}

PrivateObject priv = new PrivateObject ();
Box box = new Box();
box.setPPrivateObject(priv);
box.changevalue();
priv.increment(); // I don't want it to be changeable outside the Box class!
Run Code Online (Sandbox Code Playgroud)

在C++中,我会将所有PrivateObject属性和方法Box设为私有,并将该类声明为该类的朋友PrivateObject.

java friend

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

静态变量与Java中的静态类名称相同时会发生什么?

在下面的java示例中,任何人都可以解释为什么程序的输出是"橙色"?(这是面试问题)

public class Finder {
  public static void main(String[] args){
    System.out.println(X.Y.Z);
  }
}

class X {
  static W Y = new W();
  static class Y {
    static String Z ="Apple";
  }
}

class W {
  String Z = "Orange";
}
Run Code Online (Sandbox Code Playgroud)

java

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

在Java中实现朋友(可用C++)功能

好吧,让我们离开关于友谊是否打破封装的争论,并且实际上尝试优雅地提出一个连贯的设计.这是一个双重功能:

1)关于如何实施的一般问题:

   public class A 
   {
      friend class B;
   }
Run Code Online (Sandbox Code Playgroud)

2)为什么我需要这个功能?我的一些类实现了Serializable接口.但是,我想在Derived类中使Serializable方法受到保护,这样我就不会将它们暴露给客户端(以及文档中的javadoc).但是,内部类应该能够访问它们.在java中解决这个问题的一般方法是什么?

注意:我正在使用当前C++标准中定义的友谊.

谢谢

java javadoc

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