这里有点建筑麻烦.
在C++中,我们有"朋友"的概念,这样的朋友类可以访问私人成员.
所以,我正在开发一个Java应用程序,并试图坚持MVC架构.我有一个控制器类来管理'map_objects'之间的图形连接.我想通过使用这个控制器类隐藏DTO'map_objects'中的函数,该函数实际设置这些连接.
(即,即使控制器类实现了设置连接性所需的功能,'用户'仍然可以直接访问DTO中的setter/getter函数来自行设置它们.)
在这方面有任何设计模式或提示吗?(或者我完全搞砸了?)
DUPLICATE 有没有办法在Java中模拟C++的"朋友"概念?
我想知道为什么Java的设计没有friendC++中提供的指令,以便更好地控制哪些方法和实例变量可以从已定义类的包外部获得.
我没有看到任何实际的原因或任何特定的缺点,它似乎只是一个设计问题,但如果添加到语言中则不会产生任何问题.
我有一个现有的类,我想添加一个方法.但我希望只从特定类的特定方法调用该方法.有什么方法可以阻止来自其他类/方法的调用吗?
例如,我有一个现有的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 Api来做事情(秘密,呃嗯;).
有没有办法隐藏类,以及我的API的内部结构?
---
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)
有任何想法吗?谢谢!
我有一个包含两个软件包的库项目,分别是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) 是否真的不可能在jar文件中隐藏某些类?
我希望不允许直接实例化类以使其更灵活.这个罐子里只能看到工厂(或立面).
除了创建两个项目之外,还有其他办法解决这个问题吗?(两个项目:第一个包含类(实现),另一个引用第一个并包含工厂;后面只引用第二个)
我正在努力打包API以供公众使用.因此,我试图限制只暴露于我希望公开和可支持的方法.当然,在这下面有许多有限的访问方法.
麻烦的是我有很多内部代码需要访问这些受限制的方法而不公开这些方法.这会产生两个问题:
所以,我有大约70或80个内部类在干净隔离的包中但是具有过度宽松的访问修饰符.你会说单个包是两个邪恶中的较小者还是有更好的方法来掩盖我的内部方法,同时保持更细粒度的包?
我有兴趣在这里找到最好的做法.
我已经意识到了这一点
你知道我怎样才能让一个对象只在一个特殊的类中变化?在这个例子中,我希望对象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示例中,任何人都可以解释为什么程序的输出是"橙色"?(这是面试问题)
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) 好吧,让我们离开关于友谊是否打破封装的争论,并且实际上尝试优雅地提出一个连贯的设计.这是一个双重功能:
1)关于如何实施的一般问题:
public class A
{
friend class B;
}
Run Code Online (Sandbox Code Playgroud)
2)为什么我需要这个功能?我的一些类实现了Serializable接口.但是,我想在Derived类中使Serializable方法受到保护,这样我就不会将它们暴露给客户端(以及文档中的javadoc).但是,内部类应该能够访问它们.在java中解决这个问题的一般方法是什么?
注意:我正在使用当前C++标准中定义的友谊.
谢谢